簡潔なデータ構造アルゴリズムの概要が必要


14

(すでにメインサイト尋ねられましたが、ここでもより良い報道を求めています、申し訳ありません)

私は簡潔なデータ構造について知っていたので、私はその分野での最新の開発の良い概観を切望しています。

私はグーグルで検索して、頭からのリクエストに関するグーグルの検索結果の上部に表示される多くの記事を読みました。私はここで重要な何かを見逃したとまだ疑っています。

私にとって特に興味深いトピックは次のとおりです。

  1. 親、左/右の子、サブツリー内の要素数を取得する効率的な操作を使用した、バイナリツリーの簡潔なエンコード。

    ここでの主な質問は次のとおりです。私が知っているすべてのアプローチは、このノードの呼吸優先順で列挙されたツリーノードを仮定します私の仕事に適しているようです。深さ優先レイアウトで指定された巨大なバイナリツリーを処理し、深さ優先ノードインデックスは他のノードプロパティのキーであるため、ツリーレイアウトを変更するにはコストを最小限に抑える必要があります。したがって、BFツリーレイアウト以外を考慮した作品への参照を取得することに関心があります。

  2. 外部メモリ内の大きな可変長アイテム配列。配列は不変です。アイテムを追加/削除/編集する必要はありません。唯一の要件は、O(1)要素のアクセス時間と可能な限り低いオーバーヘッドであり、単純なオフセットとサイズのアプローチよりも優れています。ここに、タスクの一般的なデータについて収集した統計をいくつか示します。

    典型的なアイテムの数-数億、最大数千ミリアード;

    アイテムの約30%の長さは1 ビット以下です。

    40%-60%のアイテムの長さは8ビット未満です。

    32〜255ビットの長さを持つアイテムの数パーセントのみ(255ビットが制限です)

    平均アイテム長〜4ビット+/- 1ビット。

    アイテムの長さのその他の分布は理論的には可能ですが、実際に興味深いケースはすべて上記に近い統計値を持っています。

複雑な記事へのリンク、不明瞭なチュートリアル、文書化されたC / C ++ライブラリなど-似たようなタスクで役立つもの、または経験に基づいた推測でそのように見えるもの-すべてが感謝されます。

更新:質問1に追加するのを忘れました:扱っているバイナリツリーは不変です。それらを変更する必要はありません。ノードから子または親に常に移動するさまざまな方法でそれらを移動するだけで、そのような操作の平均コストはO(1)でした。

また、典型的なツリーには数千ノードのノードがあり、RAMに完全に保存するべきではありません。

回答:


12

実際に効率的な簡潔な外部メモリデータ構造に興味があると思います。その場合、おそらくいくつかの基本的なテクニックとエンジニアリングを使用して、必要なものを取得できます。

樹木については、Arroyuelo et al .: Succinct Trees in Practiceを読むことから始めます。このペーパーではメインメモリ内のツリーを扱いますが、ほとんどの手法は外部メモリでも使用でき、以下と同様の選択肢があります。

2番目の質問に関して、最も重要な選択は、アイテムに使用するエンコードを決定することです。あなたが説明する分布を考えると、まず -codesまたは -codesを使用してみます。エンコードを選択したら、次のステップはサイズブロックで配列をエンコードすることです。ブロックサイズは、サイズランダムディスク読み取りが実際に効率的になるように選択されます。γδBB

正しいブロックをすばやく見つけるには、メインメモリにあるランクディクショナリが必要です。アイテムがあると仮定すると、アイテムが新しいブロックを開始する場合、長さバイナリシーケンスを構築します。ここで、です。ギャップエンコーディングは、シーケンスを適切に圧縮します。Gupta et al .: 圧縮されたデータ構造:辞書とデータベース対応メジャーは、そのようなインデックスの一例を示します。アイテムを見つけたい場合は、ブロックを取得してデコードし、アイテムを取得する必要があります。nSnS[]=1jrankj

ランクインデックスを小さく保ちたい場合は、ブロックサイズを非常に大きくする必要があり(おそらくキロバイトまたは数十キロバイト)、上記の基本的なソリューションはCPUに負荷をかけます。これは、ディスクに保存されているブロックに少しオーバーヘッドを追加することで解決できます。基本的に同じソリューションを再帰的に適用し、各ディスクブロックに多数の小さなブロックと別のランクインデックスを格納します。正しいディスクブロックを取得したら、ブロック全体をデコードするのではなく、ランクインデックスを使用して、デコードする適切な小さなブロックを見つけます。このセカンダリインデックスを使用すると、利用可能な最速のソリッドステートドライブであっても、ランダムアクセスはおそらくI / Oバウンドになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.