私はツリーのノードに等価クラスを構築するための良いデータ構造を探しています。理想的な構造では、以下の動作は、(必要に応じてO(1)/ O(n))を高速で(謎のコードのない段落)容易にすべきである:ツリーのノードで等価クラスを構築するための良いデータ構造は何ですか?
- (A)ルートからツリーをウォーク。各ノード上で - >子遷移は、子ノード
- (B)は、2つの同値クラスマージのすべての同等のバージョンを列挙
- (C)既存のノード(子供)と他のデータ のリストから新しいノードを作成します
- (D)ノードと構造的に同等なノードを見つけます(つまり、同じ数の子を持ち、対応する子が同じ等価クラスに属し、「その他のデータ」が等しい)。
これまでのところ、私は考えました(いくつかは組み合わせて使用できます):
- 子供がノードではなくノードの集合への参照である場合、パフェ。 (A)が高速であり、(B)ツリーを歩いてノードを更新してマージされたコレクションを指すようにする必要がある、(C)新しいノードの各子を含むコレクションを見つける必要がある、(D)木を歩くことが必要です
- それらの特性によってノードのハッシュこれにより(D)ははるかに高速ですが(B)遅くなります(等価クラスがマージされたときにハッシュが更新される必要があるため)
- ノードを循環リンクリストにまとめます。 (A)が速い、(B)速いが、循環リストの "マージ"部分が実際にリスト(C)を分割するのは速く、(D)は木を歩く必要があるという事実のためである。
- 上記と同様ですが、各ノードに追加の "up"ポインタがあり、これを使用して循環リストの正規メンバーを見つけることができます。
私は甘い選択肢がありませんか?
タグはアルゴリズムではなくアルゴリズムである必要があります。 – ashawley