私は最小ヒープと最大ヒープを研究しましたが、いくつか質問があります。
配列ベースのヒープ実装を使用する場合、最低から最高にソートされた配列は最小ヒープです。親ノードが子ノード(ゼロベースの配列を使用する場合は2i +1および2i + 2)よりも大きいヒーププロパティは、子を持つすべてのノードに適用されます。
最大ヒープの最小値はリーフノードの1つにありますが、どちらかはわかりません。最小ノードは、定義上、子ノードを持つことができないため、リーフである必要があります。ただし、ヒーププロパティは、リーフノードが互いにどのように比較されるかを指定せず、親とのみ比較します。
ソートされた配列は最小ヒープですか?
はい、一般的な配列格納ヒープ規則を使用している場合は可能です。
最大ヒープの最小値はどこにありますか?
葉の1つ。これは正確には未定義です。
2 * i +1および2 * i + 2(iは0から始まる)と比較して、インデックスiの配列としてバイナリヒープを実装できます。最小ヒープでa [i] <a [2 * i +1]およびa [i] <a [2 * i + 2]
そう
1。ソートされた配列は最小ヒープです。
2。特定のインデックスはありません。それがただの葉であることを私たちが知っているすべて
これを読むことをお勧めします http://en.wikipedia.org/wiki/Binary_heap
- ソートされた配列は最小ヒープですか?
昇順で並べられている場合-はい、一般的に言えば、最小ヒープです。より正確には-バイナリヒープの配列実装次のルールがあります。
同時に、逆には機能しません。配列ベースのバイナリヒープは、並べ替えられたリストを格納しません。
- 最大ヒープの最小値はどこにありますか?
これは定義されておらず、キーを最小ヒープに格納するときにすばやく回答したい質問ではありません。 O(1)時間内にヒープの最小値と最大値の両方をピークできるようにしたい場合は、Javaで MinMaxPriorityQueue のようなクラスを使用できます。
配列は、昇順または降順で並べ替えることができます。 「ソートされた配列は最小ヒープです」というステートメントは部分的に正しいです。このステートメントの正しいバージョンは「昇順でソートされた配列は最小ヒープとして扱うことができます」であり、その補足ステートメントは「降順でソートされた配列は最大ヒープとして扱うことができます」です。
「昇順でソートされた配列は、最小ヒープとして扱うことができます」
ただし、「すべての最小ヒープが昇順でソートされた配列の形式をとることができるわけではない」ことに注意してください。
そして、最大ヒープの最小値については、これが葉に存在することだけがわかっており、O(n)で検索できます。
ソートされた配列は最小ヒープですか?
ソートされた配列はmin-heapまたはmax-heapのいずれかですが、その逆は当てはまりません。
min-heapまたはmax-heapは、必ずしもソートされた配列であるとは限りません。
最大ヒープの最小値はいくつですか?
max-heap(または優先キュー)は、定義上、コレクションから最大値をO(1)時間で提供します。誰かがmax-heapから最小値を取得する必要がある場合は、ヒープ自体を使用します。この問題の最初の場所は正しくありません。スタックがFIFOアクセスを提供することを期待するか、キューがLIFOアクセスを提供することを期待するようなものです。
ただし、jfyi、最小値は、ヒープによって形成されたツリーの葉の1つになります。それはどのサブツリーにもあり得ます。したがって、それを見つけるのにO(1)時間以上かかる別のアルゴリズムが必要です。
補足として:
n個の要素を持つヒープには、[1から(n + 1)/ 2]の葉がある場合があります。
ヒープによって形成される木の高さがhの場合、ヒープには最大2 ^(h-1)の葉があります
最大ヒープの最小値はどこにありますか?
回答:最大ヒープは、インデックスが1からnまでの単純な配列を使用して表すことができます。最初の要素は最大ヒープのルートです。ヒーププロパティ:インデックスiのノードは、2iに子を残し、2i + 1に右の子を持っています(2iと2i + 1がヒープサイズ、つまり配列の長さよりも小さい場合)。
最大ヒープのリーフノードは、インデックスi +1からnまで見つかります。ここでi = n/2; nは配列の長さです。そして、リーフノードの1つに最小値があります。
したがって、a [i +1]からa [n]の値から最大ヒープの最小値を見つけることができます。最小値を見つけるための時間計算量はorder-of(n-i)です。