W programie Excel „kompresują” ciągi do odwzorowania numerycznego (choć nie jestem pewien, czy w tym przypadku słowo kompresja jest poprawne). Oto przykład pokazany poniżej:
Chociaż pomaga to zmniejszyć całkowity rozmiar pliku i wielkość pamięci, w jaki sposób program Excel sortuje według pola ciągu? Czy każdy ciąg musiałby przejść przez mapowanie odnośników: a jeśli tak, to nie zwiększyłoby to znacznie kosztu / spowolnienia podczas sortowania na polu ciągów (co gdyby były wartości 1M, wyszukiwania kluczy 1M nie byłyby trywialny). Dwa pytania na ten temat:
- Czy w samej aplikacji Excel używane są wspólne ciągi, czy tylko podczas zapisywania danych?
- Jaki byłby wówczas przykładowy algorytm do sortowania na polu? Każdy język jest w porządku (c, c #, c ++, python).
excel
algorithm
performance
sorting
compression
David542
źródło
źródło
Odpowiedzi:
Nie mogę znaleźć, jak dokładnie Excel przechowuje komórki z
SharedStringTable
elementami w pamięci w czasie wykonywania, ale przechowywanie ich jako indeksu elementuSharedStringTable
wymaga tylko jednej dodatkowej dereferencji, aby uzyskać do nich dostęp, przy założeniu, że elementy są przechowywane jako tablica. Domyślam się, że tak to się robi. Jest to najprostszy sposób, a jedynym sposobem na przyspieszenie jest przedstawienie w czasie wykonywania reprezentacjiSharedStringTable
już posortowanych według elementów. W takim przypadku sortowanie według indeksu jest równoważne sortowaniu według wartości. Takie podejście powoduje jednak, że operacja wstawiania jest kosztowna, ponieważ gdy nowy ciąg jest wstawiany do środka tabeli, wszystkie indeksy większe niż powinny być zwiększane, a liczba takich komórek w dokumencie może być bardzo duża, aż do wszystkich komórki odnoszące się doSharedStringTable
.Jeśli komórki zawierają indeksy takie same jak w pliku, oto jak posortować komórki reprezentowane przez
columnValue
wektor na podstawie ciągów, które wskazują na przechowywane wsharedStrings
wektorze (w C ++, ponieważ powiedziałeś, że nie ma różnicy) kosztem 2 dodatkowe dereferencje na operację porównania:Nie było go w OP, ale
SharedStringTable
operacja wyszukiwania wstecznego jest powolna i pomaga buforowanie elementów w słowniku.źródło
Tabela wspólnych ciągów Microsoft Excel
Tabela wspólnych ciągów jest zgodna ze standardem Open XML, zgodnie z definicją normy ISO - ISO / IEC 29500-1: 2016 (E)
Oficjalna definicja wspólnych ciągów (cytowana z dokumentu ISO)
Wspólna tabela ciągów
Wartości ciągów mogą być przechowywane bezpośrednio w elementach komórki arkusza kalkulacyjnego; jednak przechowywanie tej samej wartości w wielu elementach komórki może skutkować bardzo dużymi częściami arkusza roboczego, co może skutkować pogorszeniem wydajności. Shared String Table to zindeksowana lista wartości ciągów, wspólna dla skoroszytu, która umożliwia implementacjom przechowywanie wartości tylko raz.
Standard ISO dotyczący wspólnych ciągów można pobrać z
https://standards.iso.org/ittf/PubliclyAvailableStandards/c071691_ISO_IEC_29500-1_2016.zip
Odpowiedzi na pytania na ten temat
-
źródło