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

各ノードが2つ以下の子を持つツリー

2
BIT:バイナリインデックスツリーの背後にある直感とは何ですか?
バイナリインデックス付きツリーは、他のデータ構造と比較して、文献が非常に少ないか比較的少ないです。それが教えられる唯一の場所はtopcoderチュートリアルです。チュートリアルはすべての説明で完了していますが、そのようなツリーの背後にある直感を理解できませんか?どうやって発明されたのですか?その正確さの実際の証拠は何ですか?


1
ハッシュテーブルとバイナリツリー
辞書を実装する場合(「顧客IDで顧客データを検索したい」)、使用される一般的なデータ構造はハッシュテーブルとバイナリ検索ツリーです。たとえば、C ++ STLライブラリは(バランスのとれた)バイナリ検索ツリーを使用して辞書(マップと呼びます)を実装し、.NETフレームワークは内部でハッシュテーブルを使用することを知っています。 これらのデータ構造の長所と短所は何ですか?特定の状況で合理的な他のオプションはありますか? キーが強力な基礎構造を持っている場合、たとえば、キーがすべて1からnまでの整数である場合など、特に興味がないことに注意してください。

2
すべての赤黒の木のバランスが取れているわけではありませんか?
直感的に、「バランスの取れたツリー」は、各ノードの左右のサブツリーが「ほぼ同じ」数のノードを持たなければならないツリーでなければなりません。 もちろん、赤黒木*(最後の定義を参照)のバランスについて話すとき、実際には、それらは高さのバランスが取れており、その意味で、バランスが取れていることを意味します。 上記の直観を次のように形式化しようとするとします。 定義:バイナリツリーはμμ\mu -balanced と呼ばれ、、ノードごとに不等式0≤μ≤120≤μ≤120 \le \mu \leq \frac{1}{2}NNN μ≤|NL|+1|N|+1≤1−μμ≤|NL|+1|N|+1≤1−μ \mu \le \frac{|N_L| + 1}{|N| + 1} \le 1 - \mu がすべて保持され、上記のステートメントが失敗するノードがあります。は、および左サブツリー内のノードの数ですがルート(ルートを含む)であるツリーの下のノードの数です。μ′>μμ′>μ\mu' \gt \mu|NL||NL||N_L|NNN|N||N||N|NNN このトピックに関する文献のいくつかでは、これらはウェイトバランスツリーと呼ばれています。 ノードを持つバイナリツリーが -balanced(定数)である場合、ツリーの高さはであるため、適切な検索を維持できることがわかります。プロパティ。nnnμμ\muμ>0μ>0\mu \gt 0O(logn)O(log⁡n)\mathcal{O}(\log n) 質問は次のとおりです。 いくつかありますすべてのビッグ十分な赤黒木があるように、 -balancedは?μ>0μ>0\mu \gt 0μμ\mu 使用する赤黒木の定義(Cormenらによるアルゴリズムの紹介から): 各ノードが赤または黒に色付けされているバイナリ検索ツリー 根は黒です すべてのNULLノードは黒です ノードが赤の場合、その子は両方とも黒です。 各ノードについて、そのノードから子孫NULLノードへのすべてのパスには、同じ数の黒いノードがあります。 注:上記の -balancedの定義では、NULLノードはカウントしません。(私たちがそうするかどうかは問題ではないと思いますが)。μμ\mu

1
順序付け前、順序付け、順序付けのどの組み合わせがユニークですか?
私たちは、予約注文を知っています、 post L(x) => [x] post N(x,l,r) => (post l) ++ (post r) ++ [x] 先行予約 pre L(x) => [x] pre N(x,l,r) => [x] ++ (pre l) ++ (pre r) 順序通りのトラバーサル応答。順次化。 in L(x) => [x] in N(x,l,r) => (in l) ++ [x] ++ (in r) ペアごとに異なるキー/ラベルを想定していても、どちらも特定のツリーを一意に記述していないことは簡単にわかります。 そのために3つのどの組み合わせを使用できますか。 肯定的な答えには、ツリーを再構成するための(効率的な)アルゴリズムと、それが正しい理由の証明(アイデア)が含まれている必要があります。負の答えは、反例、つまり、同じ表現を持つ異なるツリーを提供する必要があります。

2
二分木を数える
(私は数学的な背景を持つ学生で、特定の種類の二分木の数を数える方法を知りたいです。) バイナリツリーの Wikipediaページを見ると、サイズルート化バイナリツリーの数はこのカタロニア語番号であるというこの主張に気付きました: C_n = \ dfrac {1} {n + 1} {2n \ choose n}nnnCn=1n+1(2nn)Cn=1n+1(2nn)C_n = \dfrac{1}{n+1}{2n \choose n} しかし、私は自分でそのような結果をどのように思い付くことができるのか理解できませんか?この結果を見つける方法はありますか? さて、サブツリーの順序(左、右)が考慮されない場合はどうなりますか?たとえば、私の観点から、これら2つのツリーは同じであると考えています。 /\ /\ /\ /\ 同様の方法を適用して、これらのオブジェクトのうち正確にnnnノードを持つオブジェクトの数をカウントすることは可能でしょうか?

1
平衡二分木の2つの定義
バランスの取れたバイナリツリーの2つの定義を見てきましたが、それらは私には異なっています。 左のサブツリーの内部ノードの数と右のサブツリーの内部ノードの数が最大で1だけ異なるとノードが保持する場合、二分木はバランスが取れています。 任意の2つの葉の深さの差が最大で1である場合、二分木はバランスが取れています。 defを満たすすべてのツリーを実行します。1もdefを満たします。2?他の方法はどうですか?

1
スプレイツリーローテーションアルゴリズムが親ノードと祖父母ノードの両方を考慮するのはなぜですか?
スプレーツリーデータ構造の回転が、評価ノードの親だけでなく、祖父母(zig-zagおよびzig-zig操作)も考慮している理由はよくわかりません。以下が機能しないのはなぜですか: たとえば、ツリーに新しいノードを挿入するときに、左または右のサブツリーに挿入するかどうかを確認します。左に挿入する場合、結果を右に回転させ、右のサブツリーに対して結果を右に回転させます。再帰的にこのようになります Tree insert(Tree root, Key k){ if(k < root.key){ root.setLeft(insert(root.getLeft(), key); return rotateRight(root); } //vice versa for right subtree } それは、「スプレイ」手順全体を回避するはずです、あなたは思いませんか?

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

2
自己順序付けバイナリツリーの作成
バイナリ検索ツリーを使用して自己アクセス順序に変更する必要がある割り当てがあり、最もアクセスされる(優先度が高い)アイテムがツリーの最上部にあり、ルートが最もアクセスされるノードです。 教授は私にBSTとノード構造体を提供してくれましたが、挿入中にツリーを更新するアルゴリズムに頭を悩ませようとすると混乱します。 挿入が発生すると、現在のノードのデータが現在のノードより少ないか大きいかをチェックし、nullポインターを見つけてそこに挿入するまで再帰的に正しい方向に進みます。挿入された後、優先度が1増加します。 template <class Type> void BinarySearchTree<Type> :: insert( const Type & x, BinaryNode<Type> * & t ) { if( t == NULL ) t = new BinaryNode<Type>( x, NULL, NULL ); else if( x < t->element ) insert( x, t->left ); else if( t->element < x ) insert( …

5
ラベルなしツリーの効率的な圧縮
ラベルのない、ルート付きのバイナリツリーを検討してください。私たちはできる圧縮サブツリーへのポインタがあるたび:そのような木をTTTとT′T′T'とT=T′T=T′T = T'(通訳===構造的平等など)、我々は保存(WLOG)TTTとのすべてのポインタ置き換えるT′T′T'へのポインタでTTT。例については、uliの回答を参照してください。 上記の意味でツリーを入力として使用し、圧縮後に残る(最小限の)ノード数を計算するアルゴリズムを提供します。このアルゴリズムは、入力のノード数nで、時間O(n log n )O(nlogn)O(nlog⁡n)\cal{O}(n\log n)(均一コストモデル)で実行する必要があります。nnn これは試験問題であり、良い解決策を思い付くことができず、見たこともありません。

2
Google Code Jam万里の長城問題のより速い解決策はありますか
次のGoogle Code Jamラウンド1Cの質問を検討してください。 万里の長城は無限の線から始まり、すべての場所の高さはです。000 いくつかの部族NNN、N≤1000N≤1000N \le 1000は、開始日DDD、開始強度SSS、開始西座標WWW、開始東座標Eのパラメーターに従って、壁を壁に攻撃します。EEE。この最初の攻撃は、DDD日、範囲[W,E][W,E][W,E]、強度SSSます。[W、E]内に[W,E][W,E][W,E]高さ&lt;Sの万里の長城の部分がある場合&lt;S&lt;S< S、攻撃は成功し、その日の終わりに、[W,E][W,E][W,E]の高さ&lt;S&lt;S< Sは高さになるSSS(またはその日、他の攻撃が同じセグメントに強度ヒットした場合)S′&gt;SS′&gt;SS' > S 各部族は退却する前に最大攻撃を実行し、各攻撃はその前の攻撃から繰り返し決定されます。すべての部族は、いくつか持っている、、および攻撃の彼らの順序を決定します。お待ちしております攻撃の間に日を、彼らは攻撃範囲に移動します各攻撃(ネガティブ=西、正の単位を=東)、ただし、範囲のサイズは同じままであり、各攻撃の後、その強さも一定の値で増加/減少します。100010001000δDδD\delta_DδXδX\delta_XδSδS\delta_SδD≥1δD≥1\delta_D \ge 1δXδX\delta_X 問題の目標は、攻撃している部族の完全な説明が与えられれば、攻撃が成功する数を決定することです。 約20秒で動作するソリューションをコーディングできました。実装したソリューションにはO(AlogA+(A+X)logX)O(Alog⁡A+(A+X)log⁡X)O(A\log A + (A+X)\log X)時間かかります。ここで、A=A=A =攻撃の総数シミュレーション(最大100000010000001000000)、およびX=X=X =攻撃範囲の一意のエッジポイントの総数(最大200000020000002000000)。 高いレベルで、私のソリューション: すべての部族情報を読み込みます 攻撃範囲のすべての一意のXXX座標を計算しますO(A)O(A)O(A) 最小の高さの値を追跡するXXX範囲上の遅延更新されたバイナリツリーとして壁を表します。リーフは、間に何もない2つのXXX座標のスパンであり、すべての親ノードは、子によってカバーされる連続的な間隔を表します。- O(XlogX)O(Xlog⁡X)O(X \log X) すべての部族が実行するすべての攻撃を生成し、日ごとにソートしますO(AlogA)O(Alog⁡A)O(A \log A) 各攻撃について、成功するかどうかを確認します(logXlog⁡X\log Xクエリ時間)。日が変わったら、未処理のすべての成功した攻撃をループし、それに応じてウォールを更新します(logXlog⁡X\log X各攻撃の\ log X更新時間)。- O(AlogX)O(Alog⁡X)O(A\log X) 私の質問はこれです:よりも良い方法はありか?おそらく、部族の連続攻撃の線形性を利用する戦略的な方法はありますか?20秒は、意図したソリューションには長すぎると感じます(ただし、Javaはそのせいかもしれません)。O(AlogA+(A+X)logX)O(Alog⁡A+(A+X)log⁡X)O(A\log A + (A+X)\log X)

2
二分木の色を赤黒木にする
一般的なインタビューの質問は、特定のバイナリツリーが高さのバランスが取れているかどうかを判断するアルゴリズムを提供することです(AVLツリー定義)。 赤黒木で似たようなことができるのかと思っていました。 任意の未着色のバイナリツリー(NULLノード)が与えられた場合、ノードが赤黒ツリーのすべてのプロパティを満足するようにノードを赤/黒に色付けできるかどうかを判断できる「高速」アルゴリズムがあります。 (この質問のような定義)? 最初の考えは、NULLノードを削除して、結果のツリーが赤黒ツリーになり得るかどうかを再帰的に検証しようとすることでしたが、それはどこにも行かないようでした。 私は論文を(簡単に)ウェブ検索しましたが、この問題に対処していると思われるものを見つけることができませんでした。 単純なものが欠けている可能性があります。

2
バイナリヒープを証明する有し
私がいることを証明しようとしているバイナリヒープを持つのノードが正確に持って⌈ nはnnn葉は、ヒープは次のように構築されていることを考えます:⌈ n個2⌉⌈n2⌉\left\lceil \frac{n}{2} \right\rceil percolate upを介して新しいノードがそれぞれ挿入されます。これは、次に使用可能な子で新しいノードをそれぞれ作成する必要があることを意味します。これが意味することは、子供たちはレベルダウンで、左から右に満たされているということです。たとえば、次のヒープ: 0 / \ 1 2 う有し、このために構築されました:0、1、2(数値は、彼らが、そのノードに保持されている実際のデータの兆候を与えない、単に指標です。) これには2つの重要な意味があります。 レベルkが完全に満たされていなければ、レベルノードは存在できません。k + 1k+1k+1kkk 子は左から右に構築されるため、レベルノード間に「空のスペース」、または以下のような状況はありません。 k + 1k+1k+1 0 / \ 1 2 / \ \ 3 4 6 (これは私の定義では違法なヒープです。)したがって、このヒープを考える良い方法は、ヒープの配列実装です。 だから、私は誘導がおそらくこれを行うための良い方法になると思っていた...おそらくnのための奇妙なケースでさえ対処しなければならない何か。たとえば、この方法で構築されたヒープでさえ、偶数nには1つの子を持つ内部ノードがあり、奇数nにはそのようなノードがないという事実を使用した帰納法です。アイデア?

2
入力を広げる機能
次の特性を持つnビット数からnビット数までの関数があるかどうかを知りたいfff: fffは全単射で必要があります 両方の及び計算可能かなり高速であるべきですffff−1f−1f^{-1} fffは、入力と有意な相関関係のない数値を返す必要があります。 その理由は次のとおりです。 データを操作するプログラムを書きたい。データの一部の情報は、検索キーがアルファベットの記号であるバイナリ検索ツリーに保存されます。時間とともに、アルファベットにさらに記号を追加します。新しいシンボルは、利用可能な次の無料番号を取得するだけです。したがって、ツリーは常に小さなキーに対して小さなバイアスを持ち、必要以上にリバランスが発生します。 私のアイデアは、シンボル番号を範囲全体に広く広がるようにマングルすることです。シンボル番号は、一度だけ発生する入出力中にのみ重要であるため、このような関数を適用することはそれほど高価ではありません。fff[0,264−1][0,264−1][0,2^{64}-1] Xorshift乱数ジェネレーターの1つの反復について考えましたが、理論的には可能であるはずですが、元に戻す方法は実際にはわかりません。 誰もがそのような機能を知っていますか? これはいいアイデアですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.