私は以下の配列を持っています。 n要素を含む配列が分のヒープであるかどうかを確認するにはどうすればよいですか? 配列が最小ヒープであるかどうかをチェックする方法?
6
A
答えて
5
あなたのインデックスが(インデックス0は0が含まれている - なぜ?)、1から始まるので、以下のように、あなたが与えられたノードの子のインデックスを決定することができます
- 指定されたノードのインデックスをしてみましょう':
i
の2i
- インデックスの左の子年代右の子:
2i + 1
i
したがって、ノードごとに、両方の子がノード自体よりも大きいかどうかを簡単に確認できます。
+1
一部の人は、インデックス1にルートを置くことを好む人もいます。それはパフォーマンス上の理由からです(左の子を計算するときに余分な追加を省き、親を計算するときに減算を削除します)。差。欠点は、Cのような言語プログラマーの間で、未知のフェンスポストエラーを引き起こすことです。私は、Sedgewickが1983年にAlgorithmsの本を書いていて、彼のすべての例がPascalで、1ベースの配列を持っていたからです。彼のパスカルの例のC言語の翻訳は今日でも普及しています。 –
3
is_heap
です。あなたはちょうど適切なコンパレータを使用する必要があります。そして、あなたにも楽に、イテレータを使用して1ベースのインデックスとそれを使用することができます。
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
int main()
{
std::vector<int> v {0, 5, 9, 11, 14, 18, 19 };
std::cout << std::is_heap(
v.begin()+1, // off by 1
v.end(),
std::greater<int>() // std::less is used by default for max-heap
);
}
0
おなじみの幅優先探索(BFS)もツリーが最小/最大ヒープであるかどうかをチェックするために適用することができます。
#include <iostream>
#include <queue>
int main() {
int tree[] = {5, 9, 11, 14, 18, 19, 21, 33, 17, 27};
int size = 10;
std::queue <int> q;
q.push(0);
bool flag = true;
while(!q.empty()) {
int x = q.front();
q.pop();
int left = 2*x+1, right = 2*x+2; // 0-based indexing used here
if(left < size) { // check if left child exists or not.
q.push(left);
// check value at parent is less than child or not.
if(tree[x] > tree[left]) {
flag = false;
break;
}
}
if(right < size) { // check whether right child exists or not.
q.push(right);
if(tree[x] > tree[right]) { // check value of parent less than child.
flag = false;
break;
}
}
}
if(flag)
std::cout << "It is minimum heap.\n";
else
std::cout << "Not a minimum heap.\n";
return 0;
}
考え方はwookie919と同じです。
関連する問題
- 1. json配列がc#で空であるかどうかをチェックする方法?
- 2. 2d配列で行が空であるかどうかをチェックする方法。
- 3. VBAで配列が空であるかどうかをチェックする方法?
- 4. オブジェクトがオブジェクトの配列であるかどうかをチェックする方法
- 5. 配列の値が真であるかどうかをチェックする方法
- 6. 配列が空であるかどうかをチェックする方法?
- 7. 2次元配列が空であるかどうかをチェックする方法
- 8. 多次元配列が空であるかどうかをチェックする方法?
- 9. 変数がvbscriptの配列にあるかどうかをチェックする方法
- 10. 配列が多次元かどうかをチェックする方法
- 11. 配列インデックスが空であるかどうかをチェックする方法と、もしそうなら、次のチェック?
- 12. 配列が多次元配列であるかどうかをチェックする方法
- 13. 配列が2次元配列の要素の1つであるかどうかをチェックする方法
- 14. アイテムが配列/リスト内にあるかどうかチェックする
- 15. タグが最後のものであるかどうかをチェックする方法
- 16. numpy配列がnumpyマスク配列であるかどうかをチェック
- 17. 内部配列を再配置せずに最小ヒープから最大ヒープに切り替える
- 18. フォームビューがフィルタービーフォームであるかどうかをチェックする方法
- 19. ユーザがオンラインであるかどうかをチェックする方法
- 20. UITextFieldsが空であるかどうかをチェックする方法?
- 21. java.lang.reflect.TypeがEnumであるかどうかをチェックする方法
- 22. UITextfieldがnilであるかどうかをチェックする方法
- 23. 配列の別の配列に類似の配列が存在するかどうかをチェックする方法
- 24. 行列が行列内にあるかどうかをチェックする方法(Matlab)
- 25. C++で文字列配列に改行があるかどうかをチェックする方法は?
- 26. バイト配列が有効なUTF-8文字列であるかどうかをチェックする方法
- 27. 文字列が浮動小数点であるかどうかをチェックする方法
- 28. ObjectがmongoDbの配列でないかどうかをチェックする方法は?
- 29. オブジェクトが文字列のリストであるかどうかをチェックする方法?
- 30. リストビューが空であるかどうかチェックする方法
http://stackoverflow.com/questions/4157159/algorithm-for-checking-if-an-array-with-n-elements-is-a-minimum-heapこれを参照してください。 –
['std :: is_heap'](http://en.cppreference.com/w/cpp/algorithm/is_heap)をお探しですか? –
ノードiの子は2iと2i + 1にあります。したがって、ヒーププロパティであるため、[2i] = a [i]とa [2i + 1]> a [i]を検証します。 – Gene