ツリーのノードに同値類を構築するための優れたデータ構造を探しています。理想的な構造では、次の操作は高速(必要に応じてO(1)/ O(n))で簡単(ミステリーコードの段落なし)である必要があります。
- (A)根から木を歩きます。各ノードで->子遷移は子ノードのすべての同等のバージョンを列挙します
- (B)2つの同値類をマージする
- (C)既存のノード(子)およびその他のデータのリストから新しいノードを作成します
- (D)ノードと構造的に同等のノードを見つけて(つまり、同じ数の子を持ち、対応する子は同じ同値類に属し、それらの「他のデータ」は等しい)、新しい(または新しく変更された)ノードを配置できるようにします正しい同値類(マージを介して)
これまで私が検討した(これらのいくつかは組み合わせて使用できる):
- 子がノードではなくノードのコレクションへの参照であるパフェ。(A)高速、(B)マージされたコレクションを指すようにツリーをウォークしてノードを更新する必要がある、(C)新しいノードの各子を含むコレクションを見つける必要がある、(D)ツリーをウォークする必要がある
- ノードの特性によってノードのハッシュを維持します。これにより、(D)ははるかに高速になりますが、(B)は遅くなります(等価クラスがマージされたときにハッシュを更新する必要があるため)
- ノードをまとめて循環リンクリストにまとめます。(A)は高速です、(B)は高速ですが、循環リストの「マージ」部分が実際にリストを分割するという事実のために、(C)は高速であり、(D)はツリーを歩く必要があります
- 上記と同様ですが、各ノードに追加の「上」ポインターがあり、循環リストの正規メンバーを見つけるために使用できます。
私は甘い代替品を逃していますか?