ヒープ構造はじめに
ヒープは、論理的に完全二分木データ構造は、配列に格納されています。ヒープ大きな山の頂上、そして小さなポイントのヒープのトップ、ビッグトップ・スタック:ルートは、ヒープの最上部が最大のヒープに保存されるように、それぞれの親ノードの場合は、左と右の子ノードは、親よりも小さいです要素;マイナー頂点スタック:各ノードの値が小さい親の子ノードよりも、スタックの最上位は、最小の要素スタックを保存することです。
ヒープメモリ
ヒープは、店舗に配列を使用することですが、それを維持する方法を説明しましたか?実際には、このような完全なバイナリツリーを以下のように同じである配列に層のターンの後に完全なバイナリツリートラバーサル順序:
対応するストレージアレイは:
加えて、我々はまた、アレイ内の親と子ノードを知っている必要がありますいくつかのリレーショナル索引:
現在のノードのインデックスはi
次のとおりです。
左の子のインデックス:2 * i + 1
右の子のインデックス:2 * i + 2
親インデックス:(i - 1) / 2
(ここでは、大規模なスタックトップケース)スタックの基本的な操作
フロート:の現在位置i
対応する要素を上方に移動され、親ノード値を以下現在の為替より、現在位置が親ノードの位置に更新される場合、親ノードが決定され、それが交換されるまで繰り返されるまでプロセスを続けます。
に対応するコード:
void seekUp(int i)
{
while (i >= 0)
{
if (heap[i] > heap[(i - 1) / 2])
swap(heap[i], heap[(i - 1) / 2]);
else
return;
i = (i - 1) / 2;
}
}
シンク:の現在位置i
の子ノードが現在の値(値が最大値から選択された子ノードの親ノードの左及び右の子ノードよりも大きい場合)には、現在の位置を交換するように更新される交換よりも大きい場合には、対応する要素は、下方に移動します決意が繰り返されるまで、交換がしなくなるまで、子ノードの位置、子ノード、処理を続けます。
void seekDown(int i)
{
while (i < n)
{
int maxIdx = i;
int leftIdx = i * 2 + 1;
int rightIdx = i * 2 + 2;
if(leftIdx < n && heap[leftIdx] > heap[maxIdx]) maxIdx = leftIdx;
if(rightIdx < n && heap[rightIdx] > heap[maxIdx]) maxIdx = rightIdx;
if(maxIdx != i) swap(heap[maxIdx], heap[i]);
else return;
}
}
削除:ヒープの最上部に割り当て配列の最後の要素と、次に低い動作
void deleteHeap()
{
heap[0] = heap[--n];
seekDown(0);
}
挿入:配列の最後にメタデータを追加してから操作をフロート
void insertHeap(int val)
{
heap[n++]=val;
seekUp(n-1);
}
全体のコード
class HEAD
{
public:
HEAD() { n = 0; heap.resize(1000, 0); }
HEAD(vector<int> v) :heap(v) { n = v.size(); }
//插入
void insertHeap(int val)
{
heap[n++] = val;
seekUp(n - 1);
}
//删除
void deleteHeap()
{
heap[0] = heap[--n];
seekDown(0);
}
//获取顶端的值
int getVal()
{
if (n == 0)
return INT_MIN;
return heap[0];
}
//下沉
void seekDown(int i)
{
while (i < n)
{
int maxIdx = i;
int leftIdx = i * 2 + 1;
int rightIdx = i * 2 + 2;
if (leftIdx < n && heap[leftIdx] > heap[maxIdx]) maxIdx = leftIdx;
if (rightIdx < n && heap[rightIdx] > heap[maxIdx]) maxIdx = rightIdx;
if (maxIdx != i) swap(heap[maxIdx], heap[i]);
else return;
}
}
//上浮
void seekUp(int i)
{
while (i >= 0)
{
if (heap[i] > heap[(i - 1) / 2])
swap(heap[i], heap[(i - 1) / 2]);
else
return;
i = (i - 1) / 2;
}
}
void printHeap()
{
for (int i = 0; i < n; i++)
cout << heap[i] << " ";
cout << endl;
}
private:
vector<int> heap;
int n;
};
int main()
{
HEAD h;
h.insertHeap(5);
h.insertHeap(14);
h.insertHeap(4);
h.printHeap();
h.deleteHeap();
h.printHeap();
return 0;
}
結果:
14 5 4
5 4