Алгоритм сортування для Excel / SharedStrings


10

У Excel вони "стискають" рядки для чисельного відображення (хоча я не впевнений, що слово "компрес" в цьому випадку правильне). Ось приклад, показаний нижче:

введіть тут опис зображення

Хоча це допомагає зменшити загальний розмір файлів і слід пам’яті, як тоді Excel здійснює сортування за рядковим полем? Чи потрібно кожній окремій рядку пройти відображення пошуку: і якщо так, чи не це значно збільшить вартість / уповільнення виконання сортування в рядковому полі (що, якби були значення 1М, 1М-пошук ключів не буде тривіальне). Два питання з цього приводу:

  1. Чи спільні рядки використовуються в самій програмі Excel або лише під час збереження даних?
  2. Який би був прикладний алгоритм для сортування на полі? Будь-яка мова чудова (c, c #, c ++, python).

Мене також зацікавить обізнана відповідь на це. Я можу лише здогадуватися, що це має щось спільне з кешуванням пам'яті, але може легко помилитися.
PeterT

Я думаю, що те, що таке відображення існує у фізичному представленні XML документа, не залежить від того, як Excel внутрішньо представляє дані під час виконання. Я вважаю, що обчислювально ефективніше представляти стовпці даних у сирому вигляді (хоча це може бути зроблено багатьма способами).
alxrcs

@alxrcs Чи є документи чи книги, які потрапляють у внутрішні програми Excel, схожі на щось подібне для SQLServer? amazon.com/Pro-Server-Internals-Dmitri-Korotkevitch/dp/… , чи це взагалі чорний ящик поза командою ms?
David542

Не впевнений, вибач. Ви можете знайти в Інтернеті деякі технічні характеристики для форматів файлів, але я не думаю, що деталі про внутрішні програми Excel є такими легко знайти.
alxrcs

Як би то не було, з вашого другого питання я підозрюю, що вас більше цікавить теорія, ніж специфіка Excel, чи правильно це?
alxrcs

Відповіді:


0

Я не можу знайти, як саме Excel зберігає комірки з SharedStringTableелементами в пам'яті під час виконання, але для зберігання їх як індексу елемента SharedStringTableпотрібен лише один додатковий занурений доступ для доступу до них, припускаючи, що елементи зберігаються як масив. Тож я здогадуюсь, що так це робиться. Це найпростіший спосіб, і єдиний спосіб зробити це швидше - це представлення часу виконання SharedStringTableвже відсортованих за елементами. У такому випадку сортування за індексом еквівалентне сортування за значенням. Цей підхід, однак, робить операцію введення дорогою, оскільки при введенні нового рядка в середину таблиці всі індекси перевищують, ніж слід збільшувати, а кількість таких комірок у документі може бути дуже великою, аж до всіх клітини, що посилаються на SharedStringTable.

Якщо комірки містять індекси так само, як і у файлі, ось як можна сортувати комірки, представлені columnValueвектором, на основі рядків, які вони вказують на збережені у sharedStringsвекторі (у С ++, оскільки ви сказали, що різниці немає) вартістю 2 додаткові обмеження на операцію порівняння:

// sort indexes from columnValue based on comparing values in sharedStrings
sort(columnValue.begin(), columnValue.end(), 
     [&sharedStrings](size_t i1, size_t i2){return sharedStrings[i1] < sharedStrings[i2];});

Не було в ОП, але SharedStringTableоперація зворотного пошуку повільна, а кешування елементів у словнику допомагає.


0

Таблиця спільних рядків Microsoft Excel

Таблиця спільних рядків є та стандарт Open XML, визначений стандартом ISO - ISO / IEC 29500-1: 2016 (E)

Офіційне визначення Спільних рядків (цитується з документа ISO)

Спільна таблиця рядків

Значення рядків можуть зберігатися безпосередньо в елементах комірок електронної таблиці; однак зберігання одного і того ж значення у кількох елементах комірок може призвести до отримання дуже великих деталей аркуша, можливо, до зниження продуктивності. Таблиця загальних рядків - це індексований перелік рядкових значень, що ділиться по робочій книжці, що дозволяє реалізаціям зберігати значення лише один раз.

Стандарт ISO для спільних рядків можна завантажити з

https://standards.iso.org/ittf/PubliclyAvailableStandards/c071691_ISO_IEC_29500-1_2016.zip

Відповіді на запитання з цієї теми

Запитання 1: Чи використовуються спільні рядки в самому додатку Excel або лише при збереженні даних?

Відповідь: Спільні рядки використовуються Excel лише під час збереження документа, IE, лише з метою збереження електронної таблиці у вигляді файлу на сховищі.

Однак, коли файл відкрито для відображення, комірки заповнюються фактичними значеннями рядків, витягнутими з таблиці загальних рядків.

-

Запитання 2: Який тоді був би алгоритм прикладу для сортування на полі? Будь-яка мова чудова (c, c #, c ++, python).

Відповідь: Для такої програми, як Excel, я здогадуюсь, що спеціальний захищений варіант Quick sort є найбільш ймовірним алгоритмом, який використовується для сортування за рядковими значеннями.

Excel має обмеження в 1,048,576 рядків. За цим розміром швидкий сорт, безумовно, є переможцем. Швидке сортування може дати дуже ефективний результат для набору даних такої величини.

Ось посилання на реалізацію швидкого сортування в C ++ для сортування рядків:

http://www.cplusplus.com/forum/beginner/101599/


2
Швидке сортування буде на самій рядку, вам доведеться знецінити покажчик або зробити карту пошуку мільйон разів, хоча, ні? Я думаю, що ця відповідь в основному просто говорить "Так, це спільні рядки. Ось як зробити сортування без спільних рядків".
David542

2
Таблиця загальних рядків використовується лише для зберігання вмісту файлу на диску. Стандарт ISO не визначає, як комірки повинні бути заповнені, коли програма відкрита. Якщо комірки заповнені копією значення рядка, вилученим із таблиці загальних рядків, то можна уникнути перенаправлення.
Гопінат

1
Розумію. Так, моя головна цікава точка тут полягала в тому, як це обробляється в пам'яті, поза аспектом до / зі зберігання. Чи маєте ви якесь уявлення про цю частину?
David542

У сортуваннях excel користувач повинен вказати порядок сортування у списку стовпців (Приклад: Сортувати за стовпцем A, потім за B, потім за C, потім за D). Припустимо, що стовпець A містить повторювані рядки. Під час сортування всі рядки з однаковим значенням для стовпця A будуть відсортовані за значеннями стовпця B. Якщо комірки B також містять повторювані значення, то сортування проводитиметься у стовпці С ... і так далі, поки не буде знайдено стовпчик з унікальними значеннями. Якщо жоден із стовпців не має унікальних значень, рядки будуть пропущені.
Гопінат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.