Algorytm sortowania dla Excel / SharedStrings

10

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:

wprowadź opis zdjęcia tutaj

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:

  1. Czy w samej aplikacji Excel używane są wspólne ciągi, czy tylko podczas zapisywania danych?
  2. Jaki byłby wówczas przykładowy algorytm do sortowania na polu? Każdy język jest w porządku (c, c #, c ++, python).
David542
źródło
Będę również zainteresowany kompetentną odpowiedzią na to pytanie. Mogę tylko zgadywać, że ma to coś wspólnego z buforowaniem pamięci, ale łatwo się myli.
PeterT
Myślę, że fakt, że to odwzorowanie istnieje w fizycznej reprezentacji XML dokumentu, jest niezależny od tego, jak Excel wewnętrznie reprezentuje dane w czasie wykonywania. Uważam, że bardziej wydajne obliczeniowo jest reprezentowanie kolumn danych w sposób surowy (choć można to zrobić na wiele sposobów).
alxrcs
@alxrcs czy są jakieś dokumenty lub książki, które wchodzą do wewnętrznych elementów programu Excel, podobnie jak w przypadku SQLServer? amazon.com/Pro-Server-Internals-Dmitri-Korotkevitch/dp/… , czy to w zasadzie czarna skrzynka poza zespołem ms?
David542
Przepraszam, nie jestem pewien. Można znaleźć w Internecie niektóre specyfikacje formatów plików, ale nie sądzę, że szczegóły dotyczące wewnętrznych elementów środowiska wykonawczego Excel są tak łatwe do znalezienia.
alxrcs
W każdym razie, z drugiego pytania, które podejrzewam, że bardziej interesuje cię teoria niż specyfika Excela, prawda?
alxrcs

Odpowiedzi:

0

Nie mogę znaleźć, jak dokładnie Excel przechowuje komórki z SharedStringTableelementami w pamięci w czasie wykonywania, ale przechowywanie ich jako indeksu elementu SharedStringTablewymaga 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 reprezentacji SharedStringTablejuż 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ę do SharedStringTable.

Jeśli komórki zawierają indeksy takie same jak w pliku, oto jak posortować komórki reprezentowane przez columnValuewektor na podstawie ciągów, które wskazują na przechowywane w sharedStringswektorze (w C ++, ponieważ powiedziałeś, że nie ma różnicy) kosztem 2 dodatkowe dereferencje na operację porównania:

// 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];});

Nie było go w OP, ale SharedStringTableoperacja wyszukiwania wstecznego jest powolna i pomaga buforowanie elementów w słowniku.

isp-zax
źródło
0

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

Pytanie 1: Czy współużytkowane ciągi są używane w samej aplikacji Excel, czy tylko podczas zapisywania danych?

Odpowiedź: Udostępnione ciągi są używane przez program Excel tylko podczas zapisywania dokumentu, IE, tylko w celu przechowywania arkusza kalkulacyjnego jako pliku na dysku.

Jednak po otwarciu pliku do wyświetlenia komórki zapełniane są rzeczywistymi wartościami ciągów pobranymi z tabeli wspólnych ciągów.

-

Pytanie 2: Jaki byłby wówczas przykładowy algorytm do sortowania na polu? Każdy język jest w porządku (c, c #, c ++, python).

Odpowiedź: W przypadku aplikacji takich jak Excel wydaje mi się, że specjalna zastrzeżona odmiana szybkiego sortowania jest najbardziej prawdopodobnym algorytmem do sortowania według wartości ciągu.

Program Excel ma limit 1 048 576 wierszy. W przypadku tego rozmiaru szybkie sortowanie jest zdecydowanie zwycięzcą. Szybkie sortowanie może dać bardzo wydajny wynik dla zestawu danych tej wielkości.

Oto link do implementacji szybkiego sortowania w C ++ do sortowania ciągów:

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

Gopinath
źródło
2
szybkie sortowanie dotyczyłoby samego łańcucha, trzeba by jednak wyrejestrować wskaźnik lub zrobić milion wyszukiwań, nie? Myślę, że ta odpowiedź po prostu mówi „Tak, robi wspólne łańcuchy. Oto jak zrobić sortowanie bez wspólnych łańcuchów”.
David542
2
Wspólna tabela ciągów służy tylko do przechowywania zawartości pliku na dysku. Norma ISO nie określa, w jaki sposób należy wypełnić komórki, gdy aplikacja jest otwarta. Jeśli komórki zostaną zapełnione kopią wartości ciągu wyodrębnionej ze wspólnej tabeli ciągów, można uniknąć dereferencji.
Gopinath
1
Widzę. Tak, moim głównym przedmiotem zainteresowania było to, jak jest obsługiwane w pamięci, poza aspektem do / z pamięci. Czy masz wgląd w tę część?
David542
Podczas sortowania w programie Excel użytkownik musi określić kolejność sortowania jako listę kolumn (przykład: Sortuj według kolumny A, następnie według B, następnie według C, następnie według D). Załóżmy, że kolumna A zawiera zduplikowane ciągi. Podczas sortowania wszystkie wiersze o tej samej wartości dla kolumny A zostaną posortowane według wartości „Kolumny B”. Jeśli komórki B zawierają również zduplikowane wartości, sortowanie będzie wykonywane w kolumnie C ... tak długo, aż zostanie znaleziona kolumna z unikalnymi wartościami. Jeśli żadna z kolumn nie ma unikalnych wartości, wiersze zostaną pominięte.
Gopinath