Excel / SharedStringsのソートアルゴリズム


10

Excelでは、数値マッピングに文字列を「圧縮」します(この場合、圧縮という単語が正しいかどうかはわかりません)。以下に例を示します。

ここに画像の説明を入力してください

これは全体的なファイルサイズとメモリフットプリントを削減するのに役立ちますが、Excelは文字列フィールドでどのように並べ替えを行うのですか?すべての単一の文字列はルックアップマッピングを通過する必要がありますか。そうであれば、文字列フィールドでのソートのコストが大幅に増加したり、速度が低下したりすることはありません(1Mの値があった場合、1Mのキールックアップは行われません)。ささいな)。これに関する2つの質問:

  1. 共有文字列はExcelアプリケーション自体の中で使用されていますか、それともデータを保存するときだけですか?
  2. では、フィールドで並べ替えるアルゴリズムの例は何でしょうか?どの言語でも問題ありません(c、c#、c ++、python)。

これに対する知識の豊富な答えにも興味があります。私はそれがメモリキャッシングと関係があると推測することができますが、簡単に間違っている可能性があります。
PeterT

このマッピングがドキュメントの物理XML表現に存在するという事実は、Excelが実行時にデータを内部的にどのように表現するかに依存しないと思います。生の方法でデータの列を表現する方が計算効率が高いと思います(ただし、これは多くの方法で行われる可能性があります)。
alxrcs

@alxrcsは、SQLServerのこのようなものと同様に、Excelの内部に入るドキュメントまたは本がありますか?amazon.com/Pro-Server-Internals-Dmitri-Korotkevitch/dp/…、または基本的にmsチーム外のブラックボックスですか?
David542

わかりません、ごめんなさい。オンラインでファイル形式のいくつかの仕様を見つけることができますが、Excelランタイムの内部の詳細を見つけるのはそれほど簡単ではないと思います。
alxrcs

とにかく、2番目の質問から、Excelの詳細よりも理論に興味があると思いますが、それは正しいですか。
alxrcs

回答:


0

SharedStringTable実行時にExcelが要素を含むセルをメモリ内に正確に格納する方法を見つけることはできませんSharedStringTableが、要素の配列として格納されていると仮定すると、それらをアイテムのインデックスとして格納するには、それらにアクセスするための追加の参照が1つだけ必要です。だから私の推測では、これがどのように行われるかです。これが最も簡単な方法であり、これを高速化する唯一の方法はSharedStringTable、要素でソート済みのランタイム表現を用意することです。このような場合、インデックスによる並べ替えは、値による並べ替えと同じです。ただし、この方法では、テーブルの中央に新しい文字列が挿入されると、すべてのインデックスがインクリメントされるよりも大きくなり、ドキュメント内のそのようなセルの数が非常に多くなるため、挿入操作にコストがかかります。参照するセルSharedStringTable

セルにファイルと同じインデックスが含まれている場合、columnValueベクトルに格納されているセルに基づいて、ベクトルに格納されているセルにベクターで格納されているsharedStrings(違いがないと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ルックアップ操作は遅く、要素をディクショナリにキャッシュすると役立ちます。


0

Microsoft Excel共有文字列テーブル

共有文字列テーブルは、ISO標準-ISO / IEC 29500-1:2016(E)で定義されているOpen XML標準です

共有文字列の公式定義(ISOドキュメントから引用)

共有文字列テーブル

文字列値は、スプレッドシートのセル要素内に直接格納できます。ただし、同じ値を複数のセル要素内に格納すると、ワークシートのパーツが非常に大きくなり、パフォーマンスが低下する可能性があります。共有文字列テーブルは、ワークブック全体で共有される文字列値のインデックス付きリストです。これにより、実装は値を一度だけ格納できます。

共有文字列のISO標準は、次の場所からダウンロードできます。

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

このトピックに関する質問への回答

質問1: 共有文字列はExcelアプリケーション自体の中で使用されますか、それともデータを保存するときだけですか?

回答: 共有文字列は、スプレッドシートをファイルとしてストレージに保存する目的でのみ、ドキュメント(IE)を保存するときにのみExcelで使用されます。

ただし、ファイルを開いて表示すると、共有文字列テーブルから取得された実際の文字列値がセルに入力されます。

-

質問2:そのフィールドで並べ替えるアルゴリズムの例は何でしょうか?どの言語でも問題ありません(c、c#、c ++、python)。

回答: Excelのようなアプリケーションの場合、文字列値のソートに使用される可能性が最も高いアルゴリズムは、Quick sortの特別な独自のバリエーションであると思い ます。

Excelには1,048,576行の制限があります。このサイズでは、クイックソートが間違いなく勝者です。クイックソートは、この規模のデータセットに対して非常に効率的な結果を生成できます。

文字列をソートするためのC ++のクイックソートの実装へのリンクは次のとおりです。

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


2
クイックソートは文字列自体に対して行われますが、ポインターを逆参照するか、ルックアップマップを100万回実行する必要がありますが、違いますか?この答えは、基本的には「はい、共有文字列を処理します。共有文字列を使用せずに並べ替えを行う方法です」とだけ言っていると思います。
David542

2
共有文字列テーブルは、ファイルのコンテンツをディスクに保存するためにのみ使用されます。ISO標準では、アプリケーションが開いているときにセルにデータを入力する方法は指定されていません。セルに共有文字列テーブルから抽出された文字列値のコピーが入力されている場合、逆参照を回避できます。
Gopinath

1
そうですか。はい、ここでの私の主な関心点は、ストレージへの/からの側面以外での、インメモリでの処理方法でした。その部分について何か洞察がありますか?
David542

Excelの並べ替えでは、ユーザーは並べ替え順序を列のリストとして指定する必要があります(例:列Aで並べ替え、次にBで並べ替え、次にCで並べ替え、次にDで並べ替え)。列Aに重複した文字列が含まれているとします。並べ替え中、列Aに同じ値を持つすべての行が「列B」の値で並べ替えられます。Bのセルにも重複する値が含まれている場合、並べ替えは列C ...で行われ、一意の値を持つ列が見つかるまで続きます。どの列にも一意の値がない場合、行はスキップされます。
Gopinath
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.