最大最小堆介紹

2021-06-16 17:58:05 字數 3505 閱讀 2232

最大最小堆

1.     定義:

最小最大堆是一棵完全二叉樹,且其中每個元素有乙個key資料成員。樹的各層交替為最小層和最大層。根結點在最小層。設x是最小最大堆的任意結點。若x在最小(最大)層上,則x中的元素的key值在以x為根的子樹的所有元素中是最小(最大)的。位於最小(最大)層的結點稱為最小(最大)結點。

2.     特徵:

(1) 插入乙個具有任意key值的元素

(2) 刪除key值最大的元素

(3) 刪除key值最小的元素

3.     例如:

4.     插入10

template<classtype>

voidminmaxheap::insert(constelement&x )

n++;

intp = n/2;//p是新結點的雙親

if(!p)// 插入初始時為空的堆

switch(level(p))

elseverifymax(n, x);// 沿著最大層檢查

break;

casemax:

if(x.key > h[p].key)

elseverifymin(n, x);// 沿著最小層檢查

}//switch結束

}// insert結束 

函式level確定乙個結點是位於最小最大堆的最小層,還是位於最大層當élog2(j + 1)ù為偶數時,結點j位於最大層,否則位於最小層

函式verifymax從最大結點i開始,沿著從結點i到最小最大堆的根的路徑檢查最大結點,查詢插入元素x的正確結點。在查詢過程中,key值小於x.key的元素被移到下乙個最大層

函式verifymin與verifymax類似,所不同的是,前者從最小結點i開始,沿著從結點i到根的路徑檢查最小結點,將元素x插入正確位置。

分析:由於n個元素的最小最大堆有o(logn)層,成員函式insert的時間複雜性是o(logn)。

template<classtype>

voidminmaxheap::verifymax(inti,constelement&x )

h[i] = x;// 將x插入結點i

}

5.     刪除最小節點

一般而言,將元素x插入根結點為空的最小最大堆h中有兩種情況需要考慮:

(1) 根結點無子女,這時可將x插入根結點中。

(2) 根結點至少有乙個子女。這時堆中的最小元素(不算元素x)位於根結點的子女結點或孫子女結點(最多6個)之一。

假設該結點的編號為k,則還需要考慮下列可能性:

(a)  x.key≤h[k].key。由於h中不存在比x更小的元素,所以x可插入根。

(b)  x.key > h[k].key且k是根的子女。由於k是最大結點,其後代的key值都不大於h[k].key,因而也不大於x.key。所以可將元素h[k]移到根,並將元素x插入結點k。

(c)  x.key > h[k].key且k是根的孫子女。這時也可將元素h[k]移到根。設p是k的雙親。若x.key> h[p].key,則將x 和h[p]交換。這時,問題轉化為將x插入以k為根的子堆中,且h[k]已騰空。這與初始插入根結點為空的最小最大堆h的情形類似。

template<classtype>

element*minmaxheap::  deletemin(element&y)

y = h[1];// 儲存根元素

elementx = h[n--];

inti = 1, j = n/2;// 為重新插入x作初始化,尋找插入x的位置

while(i <= j)

else

}//if(k<=2*i+1)結束

i = k;

}//if(x.key<=h[k].key)結束

}//while結束

h[i] = x;// 注意,即使現在n == 0,對h[1] 賦值也沒錯,這樣簡化邊界判斷

return&y;

}

其中又用到私有成員函式minchildgrandchild(i),該函式返回結點i的子女結點或孫子女結點中含最小元素的結點。

如果i的子女結點或孫子女結點都含最小元素,則minchildgrandchild返回子女結點,這樣可以避免deletemin中while迴圈的進一步迭代。

分析:while迴圈的每次迭代需o(1)時間,且每經過一次迭代(可能除了最後一次以外),i都下移兩層。由於n個元素的最小最大堆有o(logn)層,deletemin的時間複雜性是o(logn)。

最大堆 最小堆

堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...

最大堆 最小堆

堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...

最大堆 最小堆

堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...