問題タブ [red-black-tree]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
algorithm - 序数インデックスによる赤黒木アクセス
私は赤黒木を持っています(二分木、すべての葉は2レベル以内です)。ノードをナビゲートできます:左、右、または親。私はノードの総数を知っています。
ツリーでN番目に小さい要素を見つける必要があります。O(n)よりも速くこれを行う方法はありますか?インデックスによるアクセスを最適化するアイデアはありますか?
java - javaの「p[z] <-- y」疑似コードの解釈は何ですか?
こちらは赤黒木用です。
疑似コード "p[z] <-- y" の場合、Java での解釈は次のようになります。
また
ありがとう :)
java - Java で r/b ツリーのノード クラスを作成する方法についてアドバイスが必要
Red Black Tree を Java で実装するように依頼されましたが、これがどのように行われるのか正確にはわかりません。r/b ツリーの実装について、私のノード クラスについて誰かがコメントしてくれると本当にうれしいです。どうぞ:
}
class - テンプレートで問題を引き起こすネストされたクラス
私のデータ構造クラスでは、以前に実装されたバランス ツリー (以前のプロジェクトから) を取得し、それを使用して C++ 標準マップ クラスの一部を実装するように依頼されました。
http://cplusplus.com/reference/stl/map/
最も明白な最初のステップは、クラス全体をテンプレート化し、個別のキーとストレージの型を可能にすることだと考えました。もちろん、テンプレートの問題に遭遇しました。通常、ローカルのネストされたデータ型「rbNode」を使用している関数をテンプレート化しようとするまで、テンプレートは機能します。関数定義にテンプレート パラメーターを含めると、構文エラーが発生します。それらを省略すると、「テンプレート パラメーターが含まれていません」というエラーが発生します。
これは、Visual Studio 2010 でエラーが発生するクラスの実装です (以下にリストされているエラー)。
ただし、この関数は、上記の関数をコメントアウトして問題なくコンパイルできます。
特に、私は得ています
missing ';' before '*'
そして
missing type specifier - int assumed. Note: C++ does not support default-int
、「LLRotation」の名前の実装がその行にあります(コメントで指摘されています)。私はテンプレートの経験があまりないので、非常にばかげた間違いを犯しているような気がします。とにかく、私のコードや情報がさらに必要な場合は、お知らせください。どんな助けでも大歓迎です。
注:私のコードには、悪い習慣などがたくさん含まれていると確信しています。まだ勉強してる。それらを指摘するのは自由ですが、私は主にテンプレートの問題に関心があります。
java - 構文"変数=変数=変数;" 何が起こっていますか?
さて、私はRedBlackTreesに関するいくつかのコードを読んでいます。そして、この行「v1 = v2 = v3=v4;」に気づきました。そして、「v1 + = v2」(v1の現在の値にv2を追加する)や「v1 = v2」(v2からv1への参照を作成する)などのようなものを理解しています。
しかし、current = parent = grand=headerのメモリ/参照で何が起こっているのか興味があります。
http://faculty.washington.edu/moishe/javademos/REDBlack/RedBTree.java
編集:10:46 PM
私はまだ質問を承認するために10分待たなければなりません、待っている女性と男性のために申し訳ありません。
java - RedBlackTrees構造?
この実装http://pastebin.com/Gg3YbPUgに基づいて、redbacktreesに頭を悩ませることはできません。
1,14,15,2,11,7,5,8という数字を使って簡単なツリーを作成しました
そして、http://www.cs.auckland.ac.nz/software/AlgAnim/red_black.htmlの例に基づくと、MyTreeは次のようになります...
そして、printTree関数からのコンソール出力
は...
(読みやすくするために、0と1の名前をCOLOR RED AND BLACKに変更しました)私が理解していることから、「header」変数はツリーのルートです。
私が次のようなことをする場合
上記のRedBlackTreeのpastebin実装から、現在の親要素がnに対して何であるかをどのように知ることができますか?
java - RedBlackTree Mark Allen Weis Remove(x) トップ ボトム アプローチ
ここにあるData Structures and Problem Solving Using Javaの元の Mark Allen Weis RedBlackTree 実装から。
ツリーからノードを削除することに頭を悩ませているようには見えません。ウィキペディアのリソースを読んだ後、「is_leaf()」関数に気付きました..これとマーク・ワイスの実装の問題は、どのノードがリーフで、どのノードがそうでないかを判断する方法がないことです
Is_Leaf Java 実装
コンソール出力
ツリー形式 (コンソールから)
ルール:
- 根元が黒い
- すべての赤いノードには黒い親があります
- 赤のノードの子はすべて黒 – 赤のノードは赤の子を持つことはできません
- ルートからリーフへのすべてのパスには、同じ数の黒いノードが含まれます
私の質問は、このRed および Back Trees の実装からの削除をどのように実装するのですか?
algorithm - 代替ランク関数 RBTree (赤黒木)
私は注文統計量を増やした赤黒の木を持っています。
それはほとんどの場合機能します。しかし、ノードの場所をソート順に返す高速関数 (O(lg n)) を実装する必要があります。私の教科書のOSランク関数のように。ただし、1 つのひねりがあります。2 つのノードのスコアが同じ場合、戻り値は同じになるはずです。これが os-rank 関数です (ルートがツリーのルートである特定のノード x に対する疑似コードで)。
しかし、私が必要としているのは、A がキー 1 を持ち、ノード B がキー 1 を持っている場合、関数は両方に対して 1 を返すものです。等々。私はこのようなもので自分自身を試しました。
何を推測しますか: テストケースが失敗しました。これが正しい方法であるかどうか、またはおそらく私が見ていない間違いを犯したかどうかを知りたいです (そうでなければ、間違いは Node.#nodeswithkeyhigher(key) 関数にあります)。
c# - 赤黒のフィックスアップ
赤黒木を実装しましたが、うまくいきません。正しい方法ではないノードを挿入します。FixUp のおかげだと思います。誰かが私がどこで間違っているか知っていますか? (1、4、9、16)を挿入すると。ノード 16 で、ルート カラーを赤に設定します。その後停止します。
デバッグしましたが、自分でエラーを見つけることができませんでした。私はc#を初めて使用し、さらに現在約3時間作業しています。成功せずに。
これは私のコードです:
java - トップダウンの 2-3-4 左寄りのレッド ブラック ツリーから削除するには、さらにどのようなローテーションが必要ですか?
私は、Sedgewick によって記述された 2 つのモード、Bottom-Up 2-3 または Top-Down 2-3-4 のいずれかで動作できる LLRB パッケージを実装しています(コード- 改善されたコードですが、2-ここに3 つのツリーがあります。RS のポインターに感謝します)。
Sedgewick は、2-3-4 モードについて多くの時間を費やしていますが、2-3 モードのツリー操作について非常に明確に説明しています。彼はまた、挿入中の色反転の順序を単純に変更するだけで、ツリーの動作がどのように変化するかを示しています (2-3-4 の場合は下方向に分割するか、2-3 の場合は上方向に分割します)。
ただし、彼は次のように 2-3-4 LLRB での削除についてごまかしています。
次のページのコードは、LLRB 2 ~ 3 ツリーの delete() の完全な実装です。これは、トップダウンの 2-3-4 ツリーへの挿入に使用されるアプローチの逆に基づいています。検索パスの途中で回転とカラー フリップを実行して、検索が 2 ノードで終わらないようにします。一番下のノードを削除できるようにします。メソッド fixUp() を使用して、insert() コードの再帰呼び出しに続くカラー フリップと回転のコードを共有します。fixUp() を使用すると、検索パスに沿って右寄りの赤いリンクとバランスの取れていない 4 つのノードを残すことができ、これらの条件がツリーの途中で修正されることが保証されます。(このアプローチは 2-3-4 ツリーでも効果的ですが、検索パスから外れた右側のノードが 4 ノードの場合は余分な回転が必要です。 )
彼の delete() 関数:
私の実装では、2 ~ 3 ツリーのすべてのツリー操作に対して LLRB 2 ~ 3 の不変条件が正しく維持されますが、2 ~ 3 ~ 4 ツリーの右側削除のサブクラスでは失敗します (これらの削除の失敗により、右寄りの赤いノードが発生しますが、雪だるま式にツリーの不均衡と最後に null ポインターの逆参照)。LLRB ツリーを説明し、いずれかのモードでツリーを構築するためのオプションを含むコード例の調査から、2-3-4 LLRB からの削除を正しく実装していないようです (つまり、Sedgewick の java上とここ)。
「検索パスから離れた右側のノードが 4 ノードの場合に余分なローテーションを行う」という彼の意味を正確に理解するのに苦労しています。おそらくこれは左回転ですが、いつ、どこで?
fixUp() を呼び出す前、または fixUp 関数の最後に、4 ノードの同等物 (すなわち RR ノード) または右寄りの 3 ノード同等物 (BR ノード) を通過して左に回転すると、同じ不変の矛盾が発生します。 .
これは、私が見つけた最小の失敗例のツリー状態です (0 からそれぞれの最大値までの要素を順次挿入することによって生成されます)。
ツリーの最初のペアは、要素 15 の削除前の不変適合状態から、削除後の明らかに壊れた状態への遷移を示しています。
2 番目は基本的に上記と同じですが、0..16 のうち 16 が削除されています (15 を削除すると同じトポロジになります)。不変矛盾がルートノードを越えることに注意してください。
重要なのは、ツリーを下ってターゲット ノードに移動する際に生成された違反を元に戻す方法を理解することです。次の 2 つのツリーは、上の最初のツリーがそれぞれ左右に移動した後 (削除せず、fixUp() で元に戻す前) にどのように見えるかを示しています。
fixUp なしで「-1」を削除しようとした後:
fixUp なしで '16' を削除しようとした後:
ノードに赤い右の子しかない場合にウォークを左に回転しようとすることは解決策の一部であるように見えますが、2 つの赤い右の子が連続して正しく処理されず、両方の子が赤の場合に FlipColor を前に付けます。状況はさらに改善されるように見えますが、依然としていくつかの不変条件に違反したままです。
右の子の右の子が赤で、兄弟が黒かどうかをさらに確認し、これが真の場合は左に回転すると、1 回だけ失敗しますが、この時点では、新しいエピサイクルではなく、新しい理論が必要なように感じます.
何か案は?
参考までに、私の実装はこちらから入手できます(いいえ、Java ではありません)。
ファローアップ:
私がこれに興味を持った理由の 1 つは、2-3-4 LLRB ツリーよりも 2-3 LLRB ツリーの方が効率的であるという多くの主張を確認するためでした。私のベンチマークでは、挿入と削除でこれが確認されています (2 ~ 3 の方が約 9% 高速です)。
次の時間は代表的なものであり、実行全体で一貫しています。
1 列目はベンチ名、2 列目は操作数、3 列目は結果です。i5M 2.27 のベンチマーク。
2 ~ 3 本の木と 2 ~ 3 ~ 4 本の木の枝の長さを見てきましたが、検索の違いを説明するものはほとんどありません (ルートからノードまでの平均距離と、それぞれ 10000 個のランダムな挿入を持つ 1000 本の木の SD):