版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第Java數(shù)據(jù)結(jié)構(gòu)中堆的向下和向上調(diào)整解析目錄一、關(guān)于堆1.堆的概念2.堆的性質(zhì)3.堆的存儲方式二、堆的創(chuàng)建1.堆向下調(diào)整2.堆的創(chuàng)建三、向上調(diào)整
一、關(guān)于堆
JDK1.8中的PriortyQueue(優(yōu)先級隊(duì)列)底層使用了堆的數(shù)據(jù)結(jié)構(gòu),而堆實(shí)際就是在完全二叉樹的基礎(chǔ)之上進(jìn)行了一些元素的調(diào)整。
1.堆的概念
堆有最大堆和最小堆之分。
最大(最?。┒咽且豢妹恳粋€節(jié)點(diǎn)的元素都不小于(大于)其孩子(如果存在)的元素的樹。大堆是一棵完全二叉樹,同時也是一棵最大樹。小堆是一棵完全二叉樹,同時也是一棵最小樹。
注意:堆中的任一子樹也是堆,即大堆的子樹也都是大堆,小堆亦是。
2.堆的性質(zhì)
堆中某個結(jié)點(diǎn)的值總是不大于或不小于其父結(jié)點(diǎn)的值
堆總是一顆完全二叉樹
3.堆的存儲方式
由堆的概念可知,堆是一顆完全二叉樹,因此可以層序的規(guī)則采用順序的方式來高效存儲。
注意:對于非完全二叉樹,則不適合使用順序方式進(jìn)行存儲,因?yàn)闉榱四軌蜻€原二叉樹,空間中必須要能夠存儲空結(jié)點(diǎn),就會導(dǎo)致空間利用率比較低
二、堆的創(chuàng)建
1.堆向下調(diào)整
對于給出的一個數(shù)據(jù),如何將其創(chuàng)建為堆呢?例如下圖:
仔細(xì)觀察上圖后發(fā)現(xiàn):根結(jié)點(diǎn)的左右子樹已經(jīng)完全滿足堆的性質(zhì),因此只需將根結(jié)點(diǎn)向下調(diào)整好即可。
以小堆為例:
1.讓parent標(biāo)記需要調(diào)整的結(jié)點(diǎn),child標(biāo)記parent的左孩子(注意:parent如果有孩子一定是先有左孩子)
2.如果parent的左孩子存在,即childsize,進(jìn)行如下操作,直到parent的左孩子不存在
parent右孩子是否存在,如果存在則找出左右孩子中較小的孩子,使用child進(jìn)行標(biāo)記
將parent與較小的孩子(也就是此時的child)比較,如果:
parent小于較小的孩子child,這個結(jié)點(diǎn)已經(jīng)調(diào)整
否則:將parent與child進(jìn)行交換,交換成功后,這時parent中大的元素已經(jīng)向下移動,可能會導(dǎo)致子樹不滿足堆的特性,就需要繼續(xù)向下調(diào)整,即parent=child,child=parent*2+1,然后循環(huán)起來
圖解如下:
代碼實(shí)現(xiàn):
privatevoidshiftDown(intparent){
//默認(rèn)讓child先標(biāo)記左孩子---因?yàn)椋簆arent可能有左沒有右
intchild=parent*2+1;
//while循環(huán)條件可以保證:parent的左孩子一定存在
//但是不能保證parent的右孩子是否存在
while(childsize){
//1.找到左右孩子中較小的孩子
if(child+1sizearray[child+1]array[child]){
child+=1;
//2.較小的孩子已經(jīng)找到了
//檢測雙親和孩子之間是否滿足堆的特性
if(array[parent]array[child]){
swap(parent,child);
//大的雙親往下走,可能會導(dǎo)致子樹又不滿足堆的特性
//因此需要繼續(xù)往下調(diào)整
parent=child;
child=parent*2+1;
}else{
//以parent為根的二叉樹已經(jīng)是堆了
return;
注意:在調(diào)整以parent為根的二叉樹時,必須要滿足parent的左子樹和右子樹已經(jīng)是堆了才可以向下調(diào)整。
時間復(fù)雜度(看最壞的情況):從根一路比較到葉子,比較的次數(shù)為完全二叉樹的高度,即時間復(fù)雜度為O(logn)。
2.堆的創(chuàng)建
向下調(diào)整的情況只能針對左右子樹已經(jīng)是堆了才可以調(diào)整,那假如根結(jié)點(diǎn)的左右子樹不滿足堆的特性,又該如何調(diào)整呢?例如下圖:
我們要從3這里的位置開始向下調(diào)整,然后逐漸向前依次向上調(diào)整
3這個位置很特殊,他是二叉樹倒數(shù)第一個非葉子結(jié)點(diǎn)
步驟:
1.找到倒數(shù)第一個非葉子結(jié)點(diǎn)
2.從該結(jié)點(diǎn)位置開始往前一直到根結(jié)點(diǎn),每遇到一個結(jié)點(diǎn)就使用向下調(diào)整
代碼實(shí)現(xiàn):
publicstaticvoidcreateHeap(int[]array){
//注意:倒數(shù)第一個非葉子節(jié)點(diǎn)剛好是最后一個節(jié)點(diǎn)的雙親
//最后一個結(jié)點(diǎn)的編號是size-1,倒數(shù)第一個非葉子節(jié)點(diǎn)的下標(biāo)為(size-1-1)/2
intlastLeafParent=(size-2)/2;
//從倒數(shù)第一個非葉子節(jié)點(diǎn)位置開始,一直到根節(jié)點(diǎn)的位置,使用向下調(diào)整
for(introot=lastLeafParent;rootroot--){
shiftDown(root);
建堆的時間復(fù)雜度:
因?yàn)槎咽峭耆鏄?,滿二叉樹也是完全二叉樹,為了簡化計(jì)算,此處使用滿二叉樹來證明:
假設(shè)滿二叉樹高度h
第一層:20個結(jié)點(diǎn),需要向下移動h-1層
第二層:21個結(jié)點(diǎn),需要向下移動h-2層
第二層:22個結(jié)點(diǎn),需要向下移動h-3層
…以此類推就可以求出所有的移動步數(shù):每一層結(jié)點(diǎn)數(shù)與對應(yīng)移動層數(shù)相乘再整體相加
然后再利用一定的數(shù)學(xué)巧妙運(yùn)算(此處省略那些繁瑣的數(shù)學(xué)公式,屬實(shí)是頭大)就得出T(n)=n=log(n+1)≈n
因此:建堆的時間復(fù)雜度為O(N)。
三、向上調(diào)整
向上調(diào)整主要的應(yīng)用場景就是在堆的插入
堆的插入總共需要兩個步驟:
1.先將元素插入到堆的末尾,即最后一個孩子之后
2.插入后如果堆的性質(zhì)遭到破壞,將最后新插入的節(jié)點(diǎn)向上調(diào)整,直到滿足堆的性質(zhì)
代碼實(shí)現(xiàn):
privatevoidshiftUp(intchild){
intparent=(child-1)/2;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026貴州中醫(yī)藥大學(xué)博士后招聘備考題庫及1套完整答案詳解
- 2026貴州醫(yī)科大學(xué)附屬白云醫(yī)院養(yǎng)老護(hù)理員招聘8人備考題庫及答案詳解(奪冠系列)
- 寶寶皮膚護(hù)理與預(yù)防濕疹
- 2025 小學(xué)一年級道德與法治上冊獨(dú)自在家不害怕課件
- 2026年工地安全管理標(biāo)準(zhǔn)化建設(shè)
- 遠(yuǎn)程會診護(hù)理的經(jīng)濟(jì)效益
- 職業(yè)醫(yī)學(xué)與工程學(xué)的聯(lián)合防護(hù)模式
- 臨潭事業(yè)編招聘2022年考試模擬試題及答案解析42
- 職業(yè)健康素養(yǎng)對醫(yī)療員工組織承諾的預(yù)測作用
- 職業(yè)健康檔案電子化傳輸過程中的加密技術(shù)應(yīng)用
- 2026云南昭通市搬遷安置局招聘公益性崗位人員3人備考題庫及答案詳解(考點(diǎn)梳理)
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會成熟人才招聘備考題庫及一套答案詳解
- 2025-2030心理健康行業(yè)市場發(fā)展分析及趨勢前景與投資戰(zhàn)略研究報告
- 技術(shù)副總年終總結(jié)
- 《馬年馬上有錢》少兒美術(shù)教育繪畫課件創(chuàng)意教程教案
- 天津市專升本高等數(shù)學(xué)歷年真題(2016-2025)
- 2025年化工原理考試題及答案
- 湖南省益陽市2024-2025學(xué)年高二上學(xué)期語文1月期末考試試卷(含答案)
- 幕墻工程售后質(zhì)量保障服務(wù)方案
- 鋁合金鑄造項(xiàng)目可行性研究報告
- 2024年西藏自治區(qū)事業(yè)單位《職業(yè)能力傾向測驗(yàn)(D類)》考試真題及答案
評論
0/150
提交評論