最大ヒープとバランスの取れたBSTを使用した優先キューの実装
バランスの取れたBSTと最大ヒープの両方がで挿入と削除を実行しO(logn)
ます。ただし、最大ヒープで最大値を見つけることは重要ですO(1)
が、これはO(logn)
バランスの取れたBSTです。
最大ヒープ内の最大値を削除するO(logn)
と、削除操作であるためにかかります。
平衡BSTでは、最大要素の削除=最大値の検索+削除; logn + lognはに減少しO(logn)
ます。したがって、平衡BSTの最大値を削除してもO(logn)
。
最大ヒープのそのようなアプリケーションの1つは優先キューであり、その主な目的はすべてのデキュー操作の最大値を削除することです。最大要素の削除が最大O(logn)
ヒープと平衡BSTの両方に対するものである場合、次の質問があります
完全に検索可能なバランスの取れたBSTを使用するのではなく、実装が簡単であるという理由だけで、優先キューの最大ヒープの目的は何ですか?
平衡係数の計算がないので、最大ヒープは不平衡二分木と呼ぶことができますか?
すべての平衡BSTは優先キューとして使用でき、
O(logn)
最大ヒープ検索がO(n)
正しい場合でも検索可能ですか?
常に複雑さは最悪の場合について計算されます。どんな助けでも大歓迎です。
回答
完全に検索可能なバランスの取れたBSTを使用するのではなく、実装が簡単であるという理由だけで、優先キューの最大ヒープの目的は何ですか?
ヒープのいくつかの利点は次のとおりです。
ソートされていない入力配列が与えられた場合でも、ヒープはO(n)時間で構築できますが、BSTにはO(nlogn)時間が必要です。
初期入力が配列の場合、同じ配列をヒープとして使用できます。つまり、追加のメモリは必要ありません。配列内のインプレースデータを使用してBSTを作成する方法を考えることはできますが、それは(プリミティブ型の場合)非常に奇妙であり、処理のオーバーヘッドが大きくなります。BSTは通常、最初から作成され、作成時にデータをノードにコピーします。
興味深い事実:ソートされた配列もヒープであるため、入力がソートされていることがわかっている場合は、ヒープを構築するために何もする必要はありません。
ヒープは相互参照を格納する必要なしに配列として格納できますが、BSTは通常、左右の参照を持つノードで構成されます。これには少なくとも2つの結果があります。
- BSTに使用されるメモリは、ヒープの約3倍です。
- いくつかの操作はヒープとBSTの両方で同じ時間計算量を持ちますが、BSTを適応させるためのオーバーヘッドははるかに大きいため、これらの操作に費やされる実際の時間はBSTの場合の(一定の)係数です。
平衡係数の計算がないので、最大ヒープは不平衡二分木と呼ぶことができますか?
ヒープは実際には完全な二分木であるため、常に可能な限りバランスが取れています。リーフは常に最後または最後の1つのレベルに配置されます。自己平衡BST(AVL、赤黒など)は、3レベル以上で葉が発生することが多い、その高レベルの平衡に勝るものはありません。
すべての平衡BSTは優先キューとして使用でき、O(logn)でも検索できますが、最大ヒープ検索はO(n)で正しいですか?
はい、その通りです。したがって、アプリケーションに検索機能が必要な場合は、BSTの方が優れています。
完全に検索可能なバランスの取れたBSTを使用するのではなく、実装が簡単であるという理由だけで、優先キューの最大ヒープの目的は何ですか?
いいえ。最大ヒープは、O(1)時間で次の(優先度を尊重する)要素をできるだけ早く返すように注意深く計測されているため、より適切に適合します。これが、可能な限り単純な優先度付きキューに求められるものです。
平衡係数の計算がないので、最大ヒープは不平衡二分木と呼ぶことができますか?
いいえ。バランスもあります。簡単に言うと、ヒープのバランス調整は、シフトアップまたはシフトダウン操作(順序が正しくない要素の交換)によって行われます。
すべての平衡BSTは優先キューとして使用でき、O(logn)でも検索できますが、最大ヒープ検索はO(n)で正しいですか?
うん!リンクリストだけでなく、配列を使用することもできます。O表記の点でより高価になり、練習がはるかに遅くなります。