Алгоритм сортировки для Excel / SharedStrings - PullRequest
10 голосов
/ 15 января 2020

В Excel они 'сжимают' строки в числовое отображение (хотя я не уверен, что в этом случае слово сжато правильно). Вот пример, показанный ниже:

enter image description here

Хотя это помогает уменьшить общий размер файла и объем памяти, как в Excel выполняется сортировка в строковом поле ? Требуется ли для каждой отдельной строки go через сопоставление поиска: и если это так, не приведет ли это к значительному увеличению / замедлению выполнения сортировки в строковом поле (что, если бы были значения 1M, поиск ключей 1M не позволил бы) быть тривиальным). Два вопроса по этому поводу:

  1. Используются ли совместно используемые строки в самом приложении Excel или только при сохранении данных?
  2. Какой тогда будет пример алгоритма для сортировки по полю? Любой язык в порядке (c, c#, c ++, python).

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Таблица общих строк Microsoft Excel

Таблица общих строк соответствует стандарту Open XML, как определено стандартом ISO - ISO / IEC 29500- 1: 2016 (E)

Официальное определение общих строк (приведено в документе ISO)

Таблица общих строк

Строковые значения могут храниться непосредственно внутри элементов ячейки электронной таблицы; однако сохранение одного и того же значения внутри нескольких элементов ячейки может привести к очень большим частям рабочего листа, что может привести к снижению производительности. Shared String Table - это индексированный список строковых значений, общий для всей рабочей книги, который позволяет реализациям сохранять значения только один раз.

Стандарт ISO для общих строк можно загрузить с

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

Ответы на вопросы по этой теме c

Вопрос 1: Используются ли общие строки в самом приложении Excel или только при сохранении данных?

Ответ: Общие строки используются Excel только во время сохранения документа, т.е. только для целей сохранения электронная таблица как файл в хранилище.

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

-

Вопрос 2: Каким будет пример алгоритма для сортировки по полю? Подойдет любой язык (c, c#, c ++, python).

Ответ: Для такого приложения, как Excel, я полагаю, что специальная запатентованная вариация Быстрая сортировка - наиболее вероятный алгоритм для сортировки по строковым значениям.

Excel имеет ограничение в 1 048 576 строк. Для этого размера быстрая сортировка определенно является победителем. Быстрая сортировка может дать очень эффективный результат для набора данных такого масштаба.

Вот ссылка на реализацию быстрой сортировки в C ++ для сортировки строк:

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

0 голосов
/ 20 января 2020

Я не могу найти, как именно Excel хранит ячейки с SharedStringTable элементами в памяти во время выполнения, но сохранение их в качестве индекса элемента в SharedStringTable требует только одной дополнительной разыменования для доступа их, предполагая, что элементы хранятся в виде массива. Так что я думаю, что это так. Это самый простой способ, и единственный способ сделать это быстрее - иметь уже отсортированные по элементам представления SharedStringTable. В этом случае сортировка по индексу эквивалентна сортировке по значению. Такой подход, однако, делает операцию вставки дорогостоящей, так как при вставке новой строки в середину таблицы все индексы больше, чем следует увеличивать, а количество таких ячеек в документе может быть очень большим, вплоть до всех ячейки, относящиеся к SharedStringTable.

Если ячейки содержат индексы, такие же, как в файле, то здесь можно отсортировать ячейки, представленные вектором columnValue, на основе строк, на которые они указывают, хранящихся в * Вектор 1010 * (в C ++, поскольку вы сказали, что нет никакой разницы) за счет 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];});

Это не было в OP, но операция обратного поиска SharedStringTable медленно и помогает кэширование элементов в словаре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...