華圖首頁(yè)
微信

華圖教育

微信號(hào):huatuv

+ 關(guān)注
微博

華圖教育

官方認(rèn)證微博

+ 關(guān)注
登錄 | 注冊(cè)
你的位置:首頁(yè) > 報(bào)考指導(dǎo) > 報(bào)考問(wèn)答 > 2018年國(guó)家電網(wǎng)考試備考計(jì)算機(jī)之?dāng)?shù)據(jù)結(jié)構(gòu)與算法(16)

2018年國(guó)家電網(wǎng)考試備考計(jì)算機(jī)之?dāng)?shù)據(jù)結(jié)構(gòu)與算法(16)

2017-11-02 09:55      文章來(lái)源:華圖教育

7.堆 (Heap)

在計(jì)算機(jī)科學(xué)中,堆是一種特殊的樹(shù)形數(shù)據(jù)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都有一個(gè)值。通常我們所說(shuō)的堆的數(shù)據(jù)結(jié)構(gòu),是指二叉堆。堆的特點(diǎn)是根結(jié)點(diǎn)的值最小(或最大),且根結(jié)點(diǎn)的兩個(gè)子樹(shù)也是一個(gè)堆。

例程

為將元素X插入堆中,找到空閑位置,建立一個(gè)空穴,若滿足堆序性(英文:heap order),則插入完成;否則將父節(jié)點(diǎn)元素裝入空穴,刪除該父節(jié)點(diǎn)元素,完成空穴上移。直至滿足堆序性。這種策略叫做上濾(percolate up)。

void Insert( ElementType X, PriorityQueue H ){ int i; if( IsFull(H) ) { printf( "Queue is full.\n" ); return; } for( i = ++H->Size; H->Element[i/2] > X; i /= 2 ) H->Elements[i] = H->Elements[i/2]; H->Elements[i] = X;}

以上是插入到一個(gè)二叉堆的過(guò)程。

DeleteMin,刪除最小元,即二叉樹(shù)的根或父節(jié)點(diǎn)。刪除該節(jié)點(diǎn)元素后,隊(duì)列最后一個(gè)元素必須移動(dòng)到堆得某個(gè)位置,使得堆仍然滿足堆序性質(zhì)。這種向下替換元素的過(guò)程叫作下濾。

ElementType DeleteMin( PriorityQueue H ){ int i, Child; ElementType MinElement, LastElement; if( IsEmpty( H ) ) { printf( "Queue is empty.\n" ); return H->Elements[0]; } MinElement = H->Elements[1]; LastElement = H->Elements[H->Size--]; for( i = 1; i*2 <= H->Size; i = Child ) { /* Find smaller child. */ Child = i*2; if( Child != H->Size && H->Elements[Child+1] < H->Elements[Child] ) Child++; /* Percolate one level. */ if( LastElement > H->Elements[Child] ) H->Elements[i] = H->Elements[Child]; else break; } H->Elements[i] = LastElement; return MinElement;}

7.算法設(shè)計(jì)的分析技術(shù)

算法是對(duì)問(wèn)題求解過(guò)程的準(zhǔn)確描述,由有限條指令組成,這些指令能在有限時(shí)間內(nèi)執(zhí)行完畢并產(chǎn)生確定性的輸出。

進(jìn)行算法的時(shí)間復(fù)雜度分析,就是求其T(n),并用O、Ω或是Θ以盡可能簡(jiǎn)單的形式進(jìn)行表示。

理想情況下,希望能夠使用Θ表示算法的時(shí)間復(fù)雜性。退而求其次,可以使用O或是Ω。

使用O時(shí),希望估計(jì)的上界的階越小越好。

使用Ω時(shí),希望估計(jì)的下界的階越大越好。

樹(shù)的高度為ëlognû,所以將一個(gè)元素插入大小為n的堆所需要的時(shí)間是O(logn).

delete(H,i) 所需要的時(shí)間是O(logn).

make-heap(A): 從數(shù)組A創(chuàng)建堆

方法1:從一個(gè)空堆開(kāi)始,逐步插入A中的每個(gè)元素,直到A中所有元素都被轉(zhuǎn)移到堆中。

時(shí)間復(fù)雜度為O(nlogn).

方法2:

MAKEHEAP(創(chuàng)建堆)

輸入:數(shù)組A[1…n]

輸出:將A[1…n]轉(zhuǎn)換成堆

1. fori← ën/2û downto 1

2. Sift-down(A,i){使以A[i]為根節(jié)點(diǎn)的子樹(shù)調(diào)整成為堆,故調(diào)用down過(guò)程}

3. endfor

時(shí)間復(fù)雜度為O(n).

(編輯:姜芃)

上一篇:2018年國(guó)家電網(wǎng)考試備考金融類之金融經(jīng)濟(jì)學(xué) 下一篇: 2018年國(guó)家電網(wǎng)考試備考計(jì)算機(jī)之?dāng)?shù)據(jù)庫(kù)系統(tǒng)
事業(yè)單位:htshiyedanwei
想考事業(yè)單位的人都關(guān)注了我們!
立即關(guān)注
備考資料
每日一練