Mengurutkan algoritma untuk Excel / SharedStrings

10

Di Excel, mereka 'kompres' string ke pemetaan numerik (meskipun saya tidak yakin bahwa kata kompres benar dalam kasus ini). Berikut ini contoh yang ditunjukkan di bawah ini:

masukkan deskripsi gambar di sini

Meskipun ini membantu mengurangi keseluruhan ukuran file dan jejak memori, bagaimana cara Excel melakukan pengurutan pada bidang string? Apakah setiap string perlu melalui pemetaan pencarian: dan jika demikian, bukankah itu akan sangat meningkatkan biaya / memperlambat melakukan pengurutan pada bidang string (bagaimana jika ada nilai 1M, pencarian kunci 1M tidak akan sepele). Dua pertanyaan tentang ini:

  1. Apakah string bersama digunakan dalam aplikasi Excel itu sendiri, atau hanya saat menyimpan data?
  2. Apa yang akan menjadi contoh algoritma untuk mengurutkan di lapangan? Bahasa apa pun baik-baik saja (c, c #, c ++, python).
David542
sumber
Saya akan tertarik pada jawaban yang luas untuk ini. Saya hanya bisa menebak bahwa ini ada hubungannya dengan cache memori tetapi bisa dengan mudah salah.
PeterT
Saya pikir fakta bahwa pemetaan ini ada dalam representasi XML fisik dari suatu dokumen tidak tergantung pada bagaimana Excel secara internal merepresentasikan data pada saat runtime. Saya akan percaya bahwa lebih efisien secara komputasi untuk merepresentasikan kolom data secara mentah (meskipun ini dapat dilakukan dengan banyak cara).
alxrcs
@alxrcs apakah ada dokumen atau buku yang masuk ke internal Excel, mirip dengan sesuatu seperti ini untuk SQLServer? amazon.com/Pro-Server-Internals-Dmitri-Korotkevitch/dp/… , atau apakah pada dasarnya kotak hitam di luar tim ms?
David542
Tidak yakin, maaf. Anda dapat menemukan secara daring beberapa spesifikasi untuk format file, tetapi saya rasa rincian tentang internal runtime Excel tidak mudah ditemukan.
alxrcs
Ngomong-ngomong, dari pertanyaan kedua Anda, saya curiga Anda lebih tertarik pada teori daripada di Excel spesifik, apakah itu benar?
alxrcs

Jawaban:

0

Saya tidak dapat menemukan bagaimana tepatnya Excel menyimpan sel dengan SharedStringTableelemen dalam memori saat runtime, tetapi menyimpannya sebagai indeks item SharedStringTablemembutuhkan hanya satu dereferensi tambahan untuk mengaksesnya, dengan asumsi bahwa elemen disimpan sebagai array. Jadi tebakan saya adalah begini caranya. Itu adalah cara paling sederhana dan satu-satunya cara untuk membuatnya lebih cepat adalah memiliki representasi runtime yang SharedStringTablesudah diurutkan berdasarkan elemen. Dalam kasus semacam itu, menyortir menurut indeks sama dengan menyortir berdasarkan nilainya. Pendekatan itu, bagaimanapun, membuat operasi penyisipan mahal seperti ketika string baru dimasukkan ke tengah tabel semua indeks lebih besar dari yang seharusnya bertambah dan jumlah sel-sel tersebut dalam dokumen bisa sangat besar, hingga semua sel mengacu pada SharedStringTable.

Jika sel berisi indeks yang sama seperti dalam file, di sini adalah bagaimana seseorang akan mengurutkan sel yang diwakili oleh columnValuevektor berdasarkan string yang mereka tunjuk untuk disimpan dalam sharedStringsvektor (dalam C ++ karena Anda mengatakan tidak ada perbedaan) dengan biaya 2 referensi tambahan per operasi perbandingan:

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

Itu tidak di OP, tetapi SharedStringTableoperasi pencarian sebaliknya lambat dan caching elemen ke dalam kamus membantu.

isp-zax
sumber
0

Microsoft Excel Shared Strings Table

Tabel string bersama adalah dan standar Open XML, sebagaimana ditentukan oleh standar ISO - ISO / IEC 29500-1: 2016 (E)

Definisi resmi dari string Bersama (dikutip dari dokumen ISO)

Tabel String Bersama

Nilai string dapat disimpan langsung di dalam elemen sel spreadsheet; Namun, menyimpan nilai yang sama di dalam beberapa elemen sel dapat menghasilkan Bagian lembar kerja yang sangat besar, mungkin mengakibatkan penurunan kinerja. Shared String Table adalah daftar nilai string yang diindeks, dibagikan di seluruh buku kerja, yang memungkinkan implementasi menyimpan nilai hanya sekali.

Standar ISO pada String Bersama dapat diunduh dari

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

Jawaban untuk pertanyaan tentang topik ini

Pertanyaan 1: Apakah string bersama digunakan dalam aplikasi Excel itu sendiri, atau hanya ketika menyimpan data?

Jawaban: String bersama hanya digunakan oleh Excel pada saat menyimpan dokumen, yaitu IE, hanya untuk tujuan menyimpan spreadsheet sebagai file pada penyimpanan.

Namun, ketika file dibuka untuk ditampilkan, sel-sel diisi dengan nilai string aktual yang ditarik dari tabel string bersama.

-

Pertanyaan 2: Apa yang akan menjadi contoh algoritma untuk mengurutkan di lapangan? Bahasa apa pun baik-baik saja (c, c #, c ++, python).

Jawab: Untuk aplikasi seperti Excel, saya kira variasi khusus kepemilikan Quick sort adalah algoritma yang paling mungkin digunakan untuk mengurutkan nilai string.

Excel memiliki batas 1.048.576 baris. Untuk ukuran ini, Quick sort jelas merupakan pemenang. Pengurutan cepat dapat menghasilkan hasil yang sangat efisien untuk kumpulan data sebesar ini.

Berikut ini tautan ke penerapan Quick Sort di C ++ untuk menyortir string:

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

Gopinath
sumber
2
sort cepat akan berada di string itu sendiri, Anda harus melakukan dereference pointer atau melakukan lookup map jutaan kali, bukan? Saya pikir jawaban ini pada dasarnya hanya mengatakan, "Ya, itu Shared Strings. Ini adalah bagaimana melakukan pengurutan tanpa shared string".
David542
2
Tabel string bersama hanya digunakan untuk menyimpan konten file ke disk. Standar ISO tidak menentukan bagaimana sel harus diisi ketika aplikasi terbuka. Jika sel diisi dengan salinan nilai string yang diekstrak dari tabel string bersama, maka dereferencing dapat dihindari.
Gopinath
1
Saya melihat. Ya, poin utama saya yang menarik di sini adalah bagaimana hal itu ditangani dalam memori, di luar aspek ke / dari-penyimpanan. Apakah Anda memiliki wawasan tentang bagian itu?
David542
Dalam pemilahan excel, pengguna harus menentukan urutan pengurutan sebagai daftar kolom (Contoh: Urutkan berdasarkan Kolom A, Lalu dengan B, Lalu dengan C, Lalu dengan D). Misalkan kolom A berisi string duplikat. Saat menyortir, semua baris dengan nilai yang sama untuk kolom A akan diurutkan pada nilai 'Kolom B'. Jika sel B juga mengandung nilai duplikat, maka pengurutan akan dilakukan pada Kolom C ... seterusnya hingga kolom dengan nilai unik ditemukan. Jika tidak ada kolom yang memiliki nilai unik, maka baris akan dilewati.
Gopinath