二叉堆的Deletemin

2021-10-22 22:15:47 字數 2272 閱讀 6855

本文討論刪除二叉堆的堆頂元素並重構二叉堆,以最小堆為例

(1)刪除堆頂元素會產生乙個位於堆頂的空穴和乙個多餘的元素lastelement(最後乙個元素),我們需要在空穴的兩個孩子以及lastelement之間進行比較

將三者中的最小者填入空穴,並產生新的空穴,直至lastelement填入某個空穴中,這種演算法對於每個空穴要進行兩次比較,而空穴最多產生log n個,故需要2*log n次比較。這便是我們最常見的演算法,**如下:

template

<

typename t>

void binaryheap

::deletemin()

lastelement=elements[size--];

for(i=

1;i*

2<=size;i=child)

elements[i]

=lastelement;

}

(2)我們引入乙個新的概念chain,chain中的每乙個元素都是其父親的兩個孩子中較小的乙個,通過log n次比較可以自上而下地構建乙個堆的chain,通過lastelement對chain執行二分查詢並插入到chain。之後我們刪除堆頂元素,chain中小於lastelement的項高度加一,大於lastelement的項高度不變,這樣我們通過log n+log log n+o(1)比較就完成了deletemin

template

<

typename t>

void binaryheap

::deletemin()

lastelement=elements[size--];

number.

push_back(1

);for(i=

1;i*

2<=size;i=child)

int k=

findposition

(chain,lastelement)

;for

(i=0

;i) elements[number[i]

]=chain[i]

;

elements[number[k]

]=lastelement;

}

(3)在(2)的基礎上我們進行擴充套件,既然問題轉化成在chain中刪除最小元並插入lastelement,那我們可以將chain構建成乙個堆,這樣就是乙個對新堆的deletemin,如此巢狀下去,我們顯然可以得出乙個比較次數為log n+log log……log n + o(1)的演算法,但切記需要在最後對插入元素的位置進行適當調整

template

<

typename t>

int binaryheap

::deleteminandinsert

(t x)

chain.

push_back

(elements[1]

);number.

push_back(1

);for(i=

1;i*

2<=size;i=child)

int k=

po_chain

(chain,x)

;for

(i=0

;i) elements[number[i]

]=chain[i+1]

;

elements[number[k]

]=x;

return number[k];}

//先找出一條chain,再把chain組建成堆,執行deletemin

template

<

typename t>

void binaryheap

::deleteminc()

template

<

typename t>

int binaryheap

::po_chain

(vector chain,t x)

binaryheap

h(chain)

; h.

print()

;int position = h.

deleteminandinsert

(x);

h.print()

;int i;

for(i=position;i2&&ih.elements[i]

= x;

h.print()

;return i-1;

}

二叉堆的實現

include include define max heap size 101 class binaryminheap void insert intvalue void removemin intgetmin void displayheaparray private int heaparray...

二叉堆的實現

1.堆的概念 這裡只需要注意兩點 a.堆的儲存方式 就是順序儲存在陣列中,在二叉樹中表現為滿二叉樹 b.堆的用處 用於排序,查詢最大最小都非常方便 2.堆的實現 heapexception.h ifndef heapexception h define heapexception h class a...

二叉堆的應用

有乙個無序陣列,要求你找出陣列中第k大的元素。給定的無序陣列如下 75 153172 202419 128如果 k 6,也就是要尋找第6大的元素,這個元素是哪乙個呢?顯然,陣列中第一大的元素是24,第二大的元素是20,第三大的元素是17 第6大的元素是9。75 153172 202419 12843...