赤黒木への挿入と削除のための反復アルゴリズムへのポインタを教えてください。.Net/C# で利用可能なすべてのアルゴリズムは再帰に基づいており、非常に多数のデータを処理することは信頼できません (したがって、挿入/削除のための多数の再帰の深さ)。反復に基づいたものを持っている人はいますか?
注 : Goletas.Collection は、大量のデータに対して非常に効率的な AVL ツリーの反復アルゴリズムを使用します。Red-Black Tree にも同様のことが必要です。
赤黒木への挿入と削除のための反復アルゴリズムへのポインタを教えてください。.Net/C# で利用可能なすべてのアルゴリズムは再帰に基づいており、非常に多数のデータを処理することは信頼できません (したがって、挿入/削除のための多数の再帰の深さ)。反復に基づいたものを持っている人はいますか?
注 : Goletas.Collection は、大量のデータに対して非常に効率的な AVL ツリーの反復アルゴリズムを使用します。Red-Black Tree にも同様のことが必要です。
ツリーベースのアルゴリズムは、本質的に再帰的です。
もちろん、それらを反復的に書き直すこともできますが、それは無駄な練習になります。理由は次のとおりです。
赤黒木や同様のデータ構造は自己均衡を保っており、その高さは格納されている値の数の対数になります。これは、再帰の上限に達することは決してないことを意味します。これには2000個の要素を挿入する必要がありますが、これは絶対に起こらないでしょう。コンピューターには十分なメモリがなく、今後も決してありません。
– 再帰にこだわる、それでいい。
アルゴリズム入門には、 Thomas H Cormen、Charles E Leiserson、Ronald L Rivest、Clifford Stein によるバージョンがあります。
疑似コードは、 Google ブックス(270 ページ)でオンラインで入手できます。
コメントで指摘されているように、特にノードへのポインターが別の場所にある場合は、14/15 行z
で置き換えるのではなくz
、データをノードにコピーするアプローチは最適ではありません。y
したがって、13 ~ 16 行目は次のようになります。
do_fixup = y.color == BLACK
if y is not z:
replace_parent(tree, y, z)
y.left = z.left
y.left.parent = y
y.right = z.right
y.right.parent = y
y.color = z.color
if do_fixup:
...
wherereplace_parent
は次のように定義されています (これは 7-12 行にも使用できます):
def replace_parent(tree, a, b):
a.parent = b.parent
if not b.parent:
tree.root = a
else:
if b is b.parent.left:
b.parent.left = a
else:
b.parent.right = a