[解決済み] 二分探索木におけるk番目の最小要素を最適な方法で探す
質問
二分探索木のk番目の最小要素をスタティック/グローバル変数を使用せずに見つけたい。どのように効率的にそれを達成するのですか? 私の頭の中にある解決策は、私が木全体の無秩序な横断を行うことを計画しているので、最悪の場合、O(n)で操作を行うことです。しかし、心の底では、私はここでBSTの特性を使っていないと感じています。私の仮定的な解決策は正しいですか、または利用可能なより良いものがありますか?
どのように解決するのですか?
ここでは、アイデアの概要を説明します。
BSTにおいて、左サブツリーのノード
T
に格納されている値よりも小さい要素のみが格納されています。
T
. もし
k
が左のサブツリーの要素数より小さい場合は
k
が左の部分木の要素数より小さい場合、最小の要素は左の部分木に属さなければならない。そうでなければ、もし
k
が大きい場合は
k
が大きい場合、最小の要素は右のサブツリーにある。
BSTを拡張して、その中の各ノードにその左サブツリーの要素数を格納させることができます(与えられたノードの左サブツリーはそのノードを含むと仮定します)。この情報により、左サブツリーまたは右サブツリーのどちらに再帰するかを決定するために、左サブツリーの要素数を繰り返し尋ねることによって、ツリーを簡単にたどることができるようになります。
さて、私たちがノードTにいるとします。
-
もし
k == num_elements(Tの左サブツリー)
であれば、探している答えは、ノード
T
. -
もし
k > num_elements(Tの左サブツリー)
の場合、明らかに左のサブツリーを無視できます。なぜなら、それらの要素も
k
よりも小さいからです。そこで、この問題をk - num_elements(left subtree of T)
右のサブツリーの最小の要素を見つけることです。 -
もし
k < num_elements(Tの左サブツリー)
であれば
k
の最小値は左部分木のどこかにあるので、問題はk
の最小の要素を見つけることに問題を軽減します。
複雑さの解析。
これには
O(depth of node)
の時間であり、これは
O(log n)
であり、バランスのとれた BST では最悪の場合
O(log n)
となります。
BSTには
O(n)
ストレージを必要とし、さらに
O(n)
を利用して要素数に関する情報を格納する。すべてのBST操作は
O(depth of node)
の時間を要し、また
O(depth of node)
の時間がかかり、ノードの挿入、削除、回転のために "要素数"の情報を維持するために余分な時間がかかる。したがって、左のサブツリーの要素数に関する情報を保存することで、BSTの空間と時間の複雑さを維持することができます。
関連
-
[解決済み】Quickselectの時間の複雑さを説明する
-
[解決済み】3値の中央値戦略
-
[解決済み] ポイントルック アット ポイント
-
[解決済み] アルゴリズム設計マニュアル』の解答はどこにあるのですか?[終了しました]
-
[解決済み] アルゴリズムAの実行時間は少なくともO(n²)である - なぜ無意味なのか?
-
[解決済み] 構造的再帰と生成的再帰はどのように違うのですか?
-
[解決済み] 2進数が3で割れているかどうかを知るには?
-
[解決済み] 線形時間でのソート?[クローズド]
-
[解決済み】2分木と2分探索木の違いについて
-
[解決済み] 任意の二分木における2つのノードの最小公倍数の先祖を見つけるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クイックソートとヒープソートの比較
-
[解決済み] ポイントルック アット ポイント
-
[解決済み] 最小スパニングツリーは負の重みを恐れているのか?
-
[解決済み] 決定論的クイックソートとは何ですか?
-
[解決済み] バックトラッキングとダイナミックプログラミングの違い
-
[解決済み] 2進数が3で割れているかどうかを知るには?
-
[解決済み] 解いてみてください。T(n) = T(n-1) + n [重複] とする。
-
[解決済み] グラフが半連結であるか否かを判定する
-
[解決済み] 整数の絶対値の計算方法
-
[解決済み] あるアルゴリズムの計算量がO(log log n)になる原因は何でしょうか?