C++の最大ヒープでK番目に大きい要素
このチュートリアルでは、 k-thを見つけるプログラムを作成します。 最大ヒープからの最大の要素。
問題を解決するために優先キューを使用します。プログラムを完了するための手順を見てみましょう。
- 正しい値で最大ヒープを初期化します。
- 優先キューを作成し、最大ヒープのルートノードを挿入します。
- k-1回繰り返すループを作成します。
- キューから最大の要素をポップします。
- 上記のノードの左右のノードを優先キューに追加します。
- 優先度付きキューの最大の要素は、現在k番目に大きい要素です。
- 返品してください。
例
コードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
struct Heap {
vector<int> elemets;
int n;
Heap(int i = 0): n(i) {
elemets = vector<int>(n);
}
};
inline int leftIndex(int i) {
return 2 * i + 1;
}
inline int rightIndex(int i) {
return 2 * i + 2;
}
int findKthGreatestElement(Heap &heap, int k) {
priority_queue<pair<int, int>> queue;
queue.push(make_pair(heap.elemets[0], 0));
for (int i = 0; i < k - 1; ++i) {
int node = queue.top().second;
queue.pop();
int left = leftIndex(node), right = rightIndex(node);
if (left < heap.n) {
queue.push(make_pair(heap.elemets[left], left));
}
if (right < heap.n) {
queue.push(make_pair(heap.elemets[right], right));
}
}
return queue.top().first;
}
int main() {
Heap heap(10);
heap.elemets = vector<int>{ 44, 42, 35, 33, 31, 19, 27, 10, 26, 14 };
cout << findKthGreatestElement(heap, 4) << endl;
return 0;
} 出力
上記のコードを実行すると、次の結果が得られます。
33
結論
チュートリアルに質問がある場合は、コメントセクションにそのことを記載してください。
-
C++の最大ヒープの最小要素。
問題の説明 最大ヒープの値が最小の要素を見つけます。 最大ヒープ以下を考えてみましょう。 ルートノードの最大ヒープ値は、常にその子ノードよりも大きくなります。このプロパティにより、値はリーフノードの1つに存在すると結論付けることができます。ヒープにn個のノードが含まれている場合、ceil(n / 2)リーフがあります。 最大ヒープは完全なバイナリツリーであるため、配列で表すことができます。このようなヒープでは、最初のリーフはfloor(n / 2)インデックスの後に存在します。したがって、この例では、最初の休暇はインデックス5に存在します。 アルゴリズム 以下のアルゴリズムを使
-
ヒープソートを実装するC++プログラム
ヒープは、最小ヒープまたは最大ヒープのいずれかである完全なバイナリツリーです。最大ヒープでは、ルートのキーは、ヒープに存在するすべてのキーの中で最大である必要があります。このプロパティは、そのバイナリツリー内のすべてのノードに対して再帰的に真である必要があります。最小ヒープは最小ヒープに似ています。 関数の説明 void BHeap ::Insert(int ele): 挿入操作を実行して、要素をヒープに挿入します。 void BHeap ::DeleteMin(): 削除操作を実行して、ヒープから最小値を削除します。 int BHeap ::ExtractMin(): ヒープから