1

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

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

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

および 2 つの子で、それぞれが親マップに要素を追加します

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

その後、ノードで検索が実行されます。たとえば、child1['jet'] は 35 を返しますが、root['jet'] は見つからないというエラーを返します。

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

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

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

4

2 に答える 2

0

ハッシュマップを比較する関数を作成するのはどうでしょうか。一致するかどうかに関係なく true または false を返します。

次に、新しいノード (マップ) をツリーに追加するときはいつでも、この関数を使用します。ツリー内のすべての既存のノードを確認し、ハッシュマップが既に存在する場合は、そのノードを指すようにします。

これには、ハッシュマップを比較するための多くの処理が必要になる場合がありますが、これによりほとんどのスペースが節約されます。

お役に立てれば。

編集:マップ上でユニオンを実行し、結果が比較のために同じ長さであるかどうかを確認できる場合があります。

于 2010-11-25T20:16:04.187 に答える
0

私が理解しているのは、あなたが探していることで'jet'あり、それによって のリスト全体が得られるということですchild1

プライマリ データはツリーになります。そのレベルのすべてのデータへの参照を保持します (たとえば'jet':35、親へのポインターと同様に)。

参照は、別のハッシュ構造を介して行われます。これにより、キー ( 'jet') がツリーへのポインターにマップされます。

map['jet']  =>  {'jet':35, parent:root}

その後、これを拡張できます

map['jet']  =>  {'car':1, 'boat':2, 'jet':35}

代替テキスト

于 2010-11-25T20:17:37.113 に答える