マップのツリーに最適なデータ構造は何ですか。


9

私はデータ構造を探しています。これは基本的にマップのツリーです。各ノードのマップには、親ノードのマップ内のエレメントだけでなく、いくつかの新しいエレメントが含まれています。ここでのマップとは、STLのマップやPythonのdictのような、キーと値を含むプログラミングマップを意味します。

たとえば、ルートノードがあるとします。

root = {'car':1, 'boat':2}

と2つの子、それぞれが親マップに要素を追加

child1 = {'car':1, 'boat':2, 'jet':35}
child2 = {'car':1, 'boat':2, 'scooter':-5}

これを可能な限りスペース効率の良いものにしたいのです。つまり、結果のマップの完全なコピーを各ノードに保存したくありませんが、理想的にはルックアップはO(log N)であり、Nはツリー全体ではなく、ノードの要素。

私はおそらくこれに使用できるスマートなハッシュ関数があると考えていましたが、何も思いつきませんでした。

単純なアプローチでは、新しく追加されたエントリを各ノードのマップに格納し、何も見つからない場合はツリーを上に移動します。木の深さに依存するので、私はこれが好きではありません。


したがって、各ノードは、親に保存されているマップを調整するマップを表しますか?
Suresh Venkat、2010年

また、数学的または地図作成の意味でのマップを意味しますか?
Suresh Venkat、2010年

数学/ CSの意味でのマップを意味します。たとえば、STLのマップのように。
phreeza 2010年

@Suresh:洗練されていないようです。質問が正しければ、子ノード親ノードのマップに新しい要素を追加します。
Jukka Suomela、2010年

そして最初の質問に答えるために、各ノードはより多くのキー/値のペアが追加されるという意味でマップを改良します。
phreeza 2010年

回答:


10

クエリとは何とも言いませんでしたが、query()がノードとキーを受け取り、関連付けられた値(またはそのような値が存在しない場合はnull)が必要だと仮定します。この場合、一般に、すべてのノードに個別のマップを格納するよりも良い方法はないと思います。たとえば、各パスノードに分岐されたノードが1つあるキャタピラーツリー(合計2nノード)を考えてみます。パスの一端でルート化します。ここで、キーのユニバースサイズがmであるとします。分岐した各ノードvとm個の可能なキーのそれぞれについて、そのキーはvに存在する場合と存在しない場合があり、どちらもサブツリー制約に準拠しています。したがって、各フォークノードに各キーが存在するかどうかは可能性があるため、必要な情報を格納するためだけにmnビットのスペースが必要です。2mn


5
ただし、この例では、冗長な情報を格納する必要がある(つまり、各子でルートノードのエントリも複製する必要がある)ことを示していません。
Jukka Suomela、2010年

1nmo(m)

15

O(logN)

Θ(O(lglgN)Θ(lgn)

xxxvv

下限については、1つの突き刺す質問でも前任者と同じくらい難しいことに注意してください(色付きの前任者検索による削減を参照)。上記の紙の参考文献は先行検索の最適な直接合計動作を示しているため、上記のアルゴリズムはノードの数とキーの総数の間の任意の比率に対して最適であることを意味します。

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