Sean の投稿 (現在受け入れられているもの) には、いくつかの誤った主張が含まれています。すみません、ショーン、失礼なことを言うつもりはありません。私の発言が事実に基づいていることを納得していただければ幸いです。
使い方が全然違うので、一概に比較はできません。
これらは両方とも、高速な検索、挿入、および削除を使用して、完全に注文されたアイテムのセットを維持するために使用されます。それらは同じインターフェースと同じ意図を持っています。
RB ツリーは通常、データへの高速アクセス (理想的には O(logN)) を提供するために使用されるメモリ内構造です。[...]
常にO(log n)
B ツリーは通常、ディスクベースの構造であるため、インメモリ データよりも本質的に低速です。
ナンセンス。検索ツリーをディスクに保存する場合、通常は B ツリーを使用します。それくらいは本当です。データをディスクに保存すると、メモリ内のデータよりもアクセスが遅くなります。しかし、ディスクに保存された赤黒木は、メモリに保存された赤黒木よりも遅くなります。
ここではリンゴとオレンジを比較しています。本当に興味深いのは、メモリ内 B ツリーとメモリ内赤黒ツリーの比較です。
[余談ですが、B ツリーは、赤黒ツリーとは対照的に、理論的には I/O モデルで効率的です。ソート用の I/O モデルを実験的にテスト (および検証) しました。Bツリーでも機能すると思います。]
B ツリーがバイナリ ツリーになることはめったにありません。通常、ノードが持つことができる子の数は多数です。
明確にするために、B ツリー ノードのサイズ範囲はツリーのパラメーターです (C++ では、テンプレート パラメーターとして整数値を使用する場合があります)。
B ツリー構造の管理は、データが変更されると非常に複雑になる可能性があります。
赤黒木よりも理解 (および実装) がはるかに簡単であることを覚えています。
B ツリーは、ディスク アクセスの数を最小限に抑えて、データの取得が合理的に確定できるようにします。
それくらいは本当です。
非常にデータベース内のデータを検索するために必要な 4 つの B ツリー アクセスのようなものを目にすることは珍しくありません。
データはありますか?
ほとんどの場合、インメモリ RB ツリーの方が高速であると言えます。
データはありますか?
ルックアップはバイナリであるため、何かを見つけるのは非常に簡単です。B ツリーはノードごとに複数の子を持つことができるため、各ノードでノードをスキャンして適切な子を探す必要があります。これは O(N) 操作です。
各ノードのサイズは固定パラメーターなので、線形スキャンを行っても O(1) です。各ノードのサイズを大幅に超える場合は、通常、配列をソートして O(log n) にすることに注意してください。
RB ツリーでは、1 つの比較を行ってから分岐しているため、O(logN) になります。
あなたはリンゴとオレンジを比較しています。O(log n) は、B ツリーの場合と同様に、ツリーの高さが最大で O(log n) であるためです。
また、赤黒ツリーで厄介な割り当てトリックを実行しない限り、B ツリーの方がキャッシュ動作が優れていると推測するのが妥当であるように思われます (あちこちに散らばるポインタではなく、配列にアクセスし、メモリを増やす割り当てオーバーヘッドが少なくなります)。これは、スピード レースで役立つ可能性があります。
B ツリー (具体的には、サイズ パラメーターが 32 と 64 の場合) は、小さいサイズの赤黒ツリーと非常に競争力があり、n の値が適度に大きい場合でも、B ツリーよりも優れているという実験的証拠を指摘できます。http://idlebox.net/2007/stx-btree/stx-btree-0.8.3/doxygen-html/speedtest.htmlを参照してください。
B ツリーは高速です。なんで?これは、メモリの局所性、キャッシュ動作の改善、ポインター追跡の減少 (同じではないにしても、ある程度重複している) が原因であると推測します。