タグ付けされた質問 「balanced-search-trees」

4
赤黒の木はなぜそんなに人気があるのですか?
私が見るところはどこでも、データ構造は赤黒木を使用して実装されているようです(std::setC ++、SortedDictionaryC#などで) アルゴリズムクラスで(a、b)、赤黒、AVLの各ツリーをカバーしたので、次のようになりました(教授に尋ねたり、数冊の本を読んだり、グーグルで調べたりすることからも)。 AVLツリーの平均深度は赤黒ツリーよりも小さいため、AVLツリーの値の検索は一貫して高速です。 赤黒木は、AVL木よりもバランスをとるための構造的な変化が少ないため、挿入/削除の速度が向上する可能性があります。これは、ランタイムと実装に大きく依存するため、これはツリーの構造変更のコストに依存するため、潜在的に言っています(ツリーが不変の場合、関数型言語でも完全に異なる可能性があります) AVLと赤黒木を比較する多くのオンラインベンチマークがありますが、私が驚いたのは、私の教授が基本的に次のいずれかを行うと言ったということです。 パフォーマンスについてそれほど気にかけない場合もあります。その場合、ほとんどの場合、AVLと赤黒の10〜20%の違いはまったく問題になりません。 または、パフォーマンスに本当に関心があります。この場合、AVLツリーと赤黒ツリーの両方を捨てて、Bツリーを使用します。Bツリーは、より良く機能するように調整できます(または(a、b)ツリー、私は)これらすべてを1つのバスケットに入れます。) その理由は、Bツリーがメモリにデータをよりコンパクトに格納するため(1つのノードに多くの値が含まれる)、キャッシュミスがはるかに少なくなるためです。また、ユースケースに基づいて実装を微調整し、Bツリーの順序をCPUキャッシュサイズなどに依存させることもできます。 問題は、実際の最新のハードウェアでの検索ツリーのさまざまな実装の実際の使用状況を分析するソースがほとんど見つからないことです。私はアルゴリズムに関する多くの本を調べましたが、異なるツリーバリアントを一緒に比較するものは見つかりませんでした。実際のプログラムで。) そうは言っても、上記で述べたことに基づいて、Bツリーがそれらを上回るはずであるときに、どこでも赤黒ツリーが使用されている特定の理由がありますか?(私が見つけることができる唯一のベンチマークとして、http://lh3lh3.users.sourceforge.net/udb.shtmlも示していますが、それは特定の実装の問題である可能性があります)。それとも、実装がかなり簡単であるために、誰もが赤黒ツリーを使用する理由、またはそれを別の言葉で言うと、実装が難しいのはなぜですか? また、関数型言語の領域に移動すると、これはどのように変わりますか?ClojureとScalaはどちらもHash配列にマップされた tryを使用しているようで、Clojureは32の分岐係数を使用しています。

1
赤黒の木を想像してください。それを作成する挿入と削除のシーケンスは常にありますか?
次の赤黒ツリーの定義を想定してみましょう。 これは二分探索木です。 各ノードは赤または黒の色で表示されます。ルートは黒です。 エッジで接続された2つのノードを同時に赤にすることはできません。 wikiのように、NILリーフの適切な定義が必要です。NILの葉は黒く着色されています。 ルートから任意のNILリーフへのパスには、同じ数の黒いノードが含まれます。 質問 赤黒ツリーのinsertand delete操作を実装したとします。さて、あなたが有効な赤黒木を与えられたら、それを構築する一連の操作insertとdelete操作が常にありますか? 動機 この質問は、この質問とこの質問からの議論によって動機付けられています。ます。 個人的には、黒のノードだけで構成される有効な赤黒木を想像すると(完全にバランスの取れた木を想像していることを意味します)、それを構築するシーケンスinsertとdelete操作があると思います。しかしながら、 私はそれを正確に証明する方法がわかりません より一般的なケースにも興味があります

2
Cのvoid型がempty / bottom型と類似していないのはなぜですか?
ウィキペディアと私が見つけた他のソースはvoid、空のタイプではなくユニットタイプとしてリストCのタイプを見つけました。void空の/下の型の定義によりよく適合するように思えるので、この混乱を見つけます。 void私が知る限り、値は存在しません。 戻り値の型がvoidの関数は、関数が何も返さないため、何らかの副作用しか実行できないことを指定します。 タイプのポインターvoid*は、他のすべてのポインタータイプのサブタイプです。また、void*C との間の変換は暗黙的です。 最後の点voidに、空の型であることの引数としてのメリットがあるかどうかはわかりvoid*ませんvoid。 一方、voidそれ自体は他のすべてのタイプのサブタイプではありません。これは、タイプがボトムタイプであるための要件であると言えます。
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

1
AVLツリーはウェイトバランスされていませんか?
前の質問では、重量バランスの取れた木の定義と赤黒木に関する質問がありました。 この質問は、AVLツリーの場合と同じ質問をすることです。 問題は、他の質問と同様にバランスのとれた木の定義を考えると、μμ\mu いくつかありますすべての大きな十分なAVL木があるように、 -balancedは?μ > 0μ>0\mu \gt 0μμ\mu AVLツリーの定義は1つだけで、あいまいさはないと思います。

2
複雑度
分割操作は、複雑度 AVLツリーに実装できますO(logn)O(log⁡n)O(\log n)か?このトピックに関する記事または特定の情報へのリンクに興味があります。 分割操作は、キーに基づいて、AVLツリーを2つの派生AVLツリーに分割します。派生したツリーの1つは、すべてのキーが元のキーよりも小さいすべての頂点を含み、2番目のツリーは残りの頂点を含みます。 これはO(log2n)O(log2⁡n)O(\log^2 n)時間で実行できることを知っています。複雑さ実装へのリンクはO(log2n)O(log2⁡n)O(\log^2 n)次のとおりです。https: //code.google.com/p/self-balancing-avl-tree/ また、2つのAVLツリーをマージして、O(logn)O(log⁡n)O(\log n)時間で、一方のツリーのキーがすべて他方のキーよりも小さくなるようにする方法も知っています。以下は、複雑度実装O(logn)O(log⁡n)O(\log n)です。 def Merge(l, r) { if (!l || !r) return l ? l : r; if (l->h <= r->h) r->l = Merge(l, r->l), Rebalance(r); else l->r = Merge(l->r, r), Rebalance(l); }

2
AVLの中央値。AVLを活用する方法?
これが私の質問の出典です。 自己均衡ツリー(AVL)を指定して、中央値を返すメソッドをコーディングします。 (中央値:データサンプルの上半分と下半分を区切る数値。例:系列が 2、7、4、9、1、5、8、3、6 中央値は5です。) 私は次の解決策を提供できます: 指定されたツリーをトラバースし、要素の数を返します。 木をトラバース n / 2 + 1(n奇数の場合)して、順番にツリーウォークを適用します。値n / 2 + 1番目の要素は、中央値です。 しかし、二分探索木でそれを行うことができますか?AVLに適したアルゴリズムはありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.