版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
堆的調(diào)整規(guī)則總結(jié)一、堆的基本概念
堆是一種特殊的樹形數(shù)據(jù)結(jié)構(gòu),通常用數(shù)組實(shí)現(xiàn)。堆具有以下關(guān)鍵特性:
(一)堆形狀特性
1.堆必須是一棵完全二叉樹。
2.完全二叉樹的定義:除最后一層外,每一層都是滿的,且最后一層節(jié)點(diǎn)從左到右連續(xù)排列。
(二)堆值特性
1.最大堆(MaxHeap):父節(jié)點(diǎn)值始終大于或等于子節(jié)點(diǎn)值。
2.最小堆(MinHeap):父節(jié)點(diǎn)值始終小于或等于子節(jié)點(diǎn)值。
二、堆的調(diào)整規(guī)則
堆的調(diào)整是指將一個無序的數(shù)組重新排列成符合堆特性的結(jié)構(gòu)。調(diào)整分為兩種場景:
(一)從無序數(shù)組構(gòu)建堆
1.自底向上調(diào)整(Bottom-UpHeapify)
(1)從最后一個非葉子節(jié)點(diǎn)開始調(diào)整。
(2)每個節(jié)點(diǎn)依次向上調(diào)整至根節(jié)點(diǎn),確保滿足堆特性。
(3)調(diào)整步驟:
a.初始化當(dāng)前節(jié)點(diǎn)為最后一個非葉子節(jié)點(diǎn)。
b.比較當(dāng)前節(jié)點(diǎn)與左右子節(jié)點(diǎn),找到最大(或最小)值節(jié)點(diǎn)。
c.若當(dāng)前節(jié)點(diǎn)不是最大(或最?。┲?,則與最大(或最?。┲倒?jié)點(diǎn)交換。
d.將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn),重復(fù)b-c步驟,直到到達(dá)根節(jié)點(diǎn)。
2.自頂向下調(diào)整(Top-DownHeapify)
(1)從根節(jié)點(diǎn)開始調(diào)整。
(2)每個節(jié)點(diǎn)依次向下調(diào)整至葉子節(jié)點(diǎn),確保滿足堆特性。
(3)調(diào)整步驟:
a.初始化當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn)。
b.比較當(dāng)前節(jié)點(diǎn)與左右子節(jié)點(diǎn),找到最大(或最?。┲倒?jié)點(diǎn)。
c.若當(dāng)前節(jié)點(diǎn)不是最大(或最?。┲?,則與最大(或最?。┲倒?jié)點(diǎn)交換。
d.將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn),重復(fù)b-c步驟,直到到達(dá)葉子節(jié)點(diǎn)。
(二)堆的插入操作
1.插入步驟
(1)將新元素添加到數(shù)組的末尾(保持完全二叉樹形狀)。
(2)通過上浮調(diào)整(BubbleUp)將新元素與父節(jié)點(diǎn)比較并交換,直到滿足堆特性。
(3)上浮調(diào)整步驟:
a.初始化當(dāng)前節(jié)點(diǎn)為插入位置。
b.比較當(dāng)前節(jié)點(diǎn)與父節(jié)點(diǎn),若不滿足堆特性則交換。
c.將當(dāng)前節(jié)點(diǎn)更新為被交換的父節(jié)點(diǎn),重復(fù)a-b步驟,直到到達(dá)根節(jié)點(diǎn)或滿足堆特性。
(三)堆的刪除操作
1.刪除步驟
(1)將根節(jié)點(diǎn)替換為數(shù)組的最后一個元素(保持完全二叉樹形狀)。
(2)通過下沉調(diào)整(BubbleDown)將根節(jié)點(diǎn)與子節(jié)點(diǎn)比較并交換,直到滿足堆特性。
(3)下沉調(diào)整步驟:
a.初始化當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn)。
b.比較當(dāng)前節(jié)點(diǎn)與左右子節(jié)點(diǎn),找到最大(或最?。┲倒?jié)點(diǎn)。
c.若當(dāng)前節(jié)點(diǎn)不是最大(或最小)值,則與最大(或最?。┲倒?jié)點(diǎn)交換。
d.將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn),重復(fù)a-c步驟,直到到達(dá)葉子節(jié)點(diǎn)或滿足堆特性。
三、堆調(diào)整的效率分析
(一)時(shí)間復(fù)雜度
1.從無序數(shù)組構(gòu)建堆:
-自底向上調(diào)整:O(n),其中n為節(jié)點(diǎn)數(shù)量。
-自頂向下調(diào)整:O(nlogn),效率較低。
2.插入操作:O(logn),需上浮調(diào)整。
3.刪除操作:O(logn),需下沉調(diào)整。
(二)空間復(fù)雜度
1.所有操作均原地修改數(shù)組,空間復(fù)雜度為O(1)。
四、應(yīng)用場景
1.優(yōu)先隊(duì)列實(shí)現(xiàn)。
2.堆排序算法的基礎(chǔ)。
3.貪心算法中的狀態(tài)管理。
4.圖算法中的最小/最大生成樹計(jì)算。
一、堆的基本概念
堆是一種特殊的樹形數(shù)據(jù)結(jié)構(gòu),通常用數(shù)組實(shí)現(xiàn)。堆具有以下關(guān)鍵特性:
(一)堆形狀特性
1.堆必須是一棵完全二叉樹。
-完全二叉樹的定義:除最后一層外,每一層都是滿的,且最后一層節(jié)點(diǎn)從左到右連續(xù)排列。
-數(shù)組表示法中,節(jié)點(diǎn)的索引與其子節(jié)點(diǎn)索引存在固定關(guān)系,便于快速訪問。
-對于索引為i的節(jié)點(diǎn):
-左子節(jié)點(diǎn)索引為`2i+1`。
-右子節(jié)點(diǎn)索引為`2i+2`。
-父節(jié)點(diǎn)索引為`(i-1)/2`(向下取整)。
(二)堆值特性
1.最大堆(MaxHeap):父節(jié)點(diǎn)值始終大于或等于子節(jié)點(diǎn)值。
-應(yīng)用場景:快速獲取最大值。
-示例:在數(shù)組中,根節(jié)點(diǎn)(索引0)存儲最大值。
2.最小堆(MinHeap):父節(jié)點(diǎn)值始終小于或等于子節(jié)點(diǎn)值。
-應(yīng)用場景:快速獲取最小值。
-示例:在數(shù)組中,根節(jié)點(diǎn)(索引0)存儲最小值。
三、堆的調(diào)整規(guī)則
堆的調(diào)整是指將一個無序的數(shù)組重新排列成符合堆特性的結(jié)構(gòu)。調(diào)整分為兩種場景:
(一)從無序數(shù)組構(gòu)建堆
1.自底向上調(diào)整(Bottom-UpHeapify)
-適用于從空堆逐步添加元素,或從完全二叉樹的葉子節(jié)點(diǎn)向上構(gòu)建堆。
-優(yōu)勢:時(shí)間復(fù)雜度為O(n),效率較高。
-具體步驟:
(1)確定起始調(diào)整節(jié)點(diǎn):
-從最后一個非葉子節(jié)點(diǎn)開始調(diào)整。
-非葉子節(jié)點(diǎn)計(jì)算公式:`start_index=(n-2)/2`,其中n為數(shù)組長度。
(2)逐個節(jié)點(diǎn)向上調(diào)整:
-從`start_index`開始,依次向上遍歷至根節(jié)點(diǎn)(索引0)。
-對于每個節(jié)點(diǎn)i:
a.比較與交換:
-比較節(jié)點(diǎn)i與其左右子節(jié)點(diǎn)(`2i+1`和`2i+2`)。
-找出三個節(jié)點(diǎn)中的最大值(在最大堆中),或最小值(在最小堆中)。
-若節(jié)點(diǎn)i不是最大/最小值,則與最大/最小子節(jié)點(diǎn)交換。
b.更新當(dāng)前節(jié)點(diǎn):
-將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn)(交換后子節(jié)點(diǎn)可能不再滿足堆特性)。
-重復(fù)比較與交換,直到節(jié)點(diǎn)i為葉子節(jié)點(diǎn)或滿足堆特性。
(3)終止條件:
-當(dāng)遍歷至根節(jié)點(diǎn)且所有節(jié)點(diǎn)均滿足堆特性時(shí),構(gòu)建完成。
2.自頂向下調(diào)整(Top-DownHeapify)
-適用于從有序數(shù)組轉(zhuǎn)換為堆,或刪除根節(jié)點(diǎn)后重新調(diào)整。
-優(yōu)勢:代碼實(shí)現(xiàn)簡單,但時(shí)間復(fù)雜度為O(nlogn),效率較低。
-具體步驟:
(1)初始化當(dāng)前節(jié)點(diǎn):
-從根節(jié)點(diǎn)(索引0)開始。
(2)逐個節(jié)點(diǎn)向下調(diào)整:
-對于每個節(jié)點(diǎn)i:
a.比較與交換:
-比較節(jié)點(diǎn)i與其左右子節(jié)點(diǎn)。
-找出最大/最小子節(jié)點(diǎn)。
-若節(jié)點(diǎn)i不是最大/最小值,則與最大/最小子節(jié)點(diǎn)交換。
b.更新當(dāng)前節(jié)點(diǎn):
-將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn)。
-重復(fù)比較與交換,直到當(dāng)前節(jié)點(diǎn)為葉子節(jié)點(diǎn)或滿足堆特性。
(3)終止條件:
-當(dāng)遍歷至最后一個葉子節(jié)點(diǎn)且所有節(jié)點(diǎn)均滿足堆特性時(shí),調(diào)整完成。
(二)堆的插入操作
1.插入步驟
-目標(biāo):將一個新元素添加到堆中,并保持堆特性。
-具體步驟:
(1)添加元素:
-將新元素添加到數(shù)組的末尾(保持完全二叉樹形狀)。
-例如,在最大堆中,新元素初始值可能小于根節(jié)點(diǎn),需要調(diào)整。
(2)上浮調(diào)整(BubbleUp):
-初始化當(dāng)前節(jié)點(diǎn)為插入位置(數(shù)組末尾)。
-比較當(dāng)前節(jié)點(diǎn)與父節(jié)點(diǎn):
a.若當(dāng)前節(jié)點(diǎn)值大于父節(jié)點(diǎn)值(最大堆),或小于父節(jié)點(diǎn)值(最小堆),則交換。
b.若不滿足交換條件,則停止調(diào)整。
-將當(dāng)前節(jié)點(diǎn)更新為被交換的父節(jié)點(diǎn),重復(fù)比較與交換,直到到達(dá)根節(jié)點(diǎn)或滿足堆特性。
(3)終止條件:
-當(dāng)當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn),或父節(jié)點(diǎn)值大于/小于當(dāng)前節(jié)點(diǎn)值時(shí),插入完成。
(三)堆的刪除操作
1.刪除步驟
-目標(biāo):刪除堆頂元素(根節(jié)點(diǎn)),并保持堆特性。
-具體步驟:
(1)替換根節(jié)點(diǎn):
-將數(shù)組的最后一個元素移動到根節(jié)點(diǎn)位置(覆蓋原根節(jié)點(diǎn))。
-數(shù)組長度減1,保持完全二叉樹形狀。
(2)下沉調(diào)整(BubbleDown):
-初始化當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn)。
-比較當(dāng)前節(jié)點(diǎn)與左右子節(jié)點(diǎn):
a.找出最大/最小子節(jié)點(diǎn)。
b.若當(dāng)前節(jié)點(diǎn)不是最大/最小值,則與最大/最小子節(jié)點(diǎn)交換。
c.將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn)。
-重復(fù)比較與交換,直到當(dāng)前節(jié)點(diǎn)為葉子節(jié)點(diǎn)或滿足堆特性。
(3)終止條件:
-當(dāng)當(dāng)前節(jié)點(diǎn)為葉子節(jié)點(diǎn),或左右子節(jié)點(diǎn)不存在(即無子節(jié)點(diǎn)),下沉調(diào)整完成。
三、堆調(diào)整的效率分析
(一)時(shí)間復(fù)雜度
1.從無序數(shù)組構(gòu)建堆:
-自底向上調(diào)整:O(n),可通過數(shù)學(xué)證明優(yōu)化。
-自頂向下調(diào)整:O(nlogn),適用于少量節(jié)點(diǎn)調(diào)整。
2.插入操作:O(logn),需上浮調(diào)整。
3.刪除操作:O(logn),需下沉調(diào)整。
(二)空間復(fù)雜度
1.所有操作均原地修改數(shù)組,空間復(fù)雜度為O(1)。
四、堆調(diào)整的優(yōu)化技巧
(一)減少比較次數(shù)
1.提前終止:
-在上浮/下沉調(diào)整中,若交換后父節(jié)點(diǎn)/子節(jié)點(diǎn)值相等,可提前終止。
2.懶惰比較:
-記錄最后一次交換的位置,后續(xù)調(diào)整僅在該位置以下進(jìn)行比較。
(二)避免重復(fù)計(jì)算
1.緩存子節(jié)點(diǎn)值:
-在下沉調(diào)整中,可先計(jì)算左右子節(jié)點(diǎn)值,再進(jìn)行比較,避免多次訪問子節(jié)點(diǎn)。
2.索引偏移:
-對于固定大小的數(shù)組,可預(yù)計(jì)算父/子節(jié)點(diǎn)索引偏移量,減少除法運(yùn)算。
(三)并行化處理
1.分塊調(diào)整:
-將堆劃分為多個區(qū)塊,并行執(zhí)行上浮/下沉調(diào)整。
-注意邊界處理,確保區(qū)塊間調(diào)整順序正確。
2.GPU加速:
-利用GPU并行計(jì)算能力,加速大規(guī)模堆調(diào)整。
五、堆調(diào)整的常見問題
(一)數(shù)組越界問題
1.檢查子節(jié)點(diǎn)索引:
-在比較子節(jié)點(diǎn)前,驗(yàn)證索引是否在數(shù)組范圍內(nèi)。
-示例:`if(2i+1<n)`。
2.邊界處理:
-單子節(jié)點(diǎn)(如只有左子節(jié)點(diǎn))時(shí),比較邏輯需調(diào)整。
(二)調(diào)整順序問題
1.自底向上vs自頂向下:
-選擇合適的調(diào)整方式取決于應(yīng)用場景。
-自底向上適用于動態(tài)添加元素,自頂向下適用于靜態(tài)調(diào)整。
(三)堆類型混淆
1.明確堆類型:
-最大堆和最小堆操作相反,需避免混淆。
-示例:最大堆插入時(shí),若新元素大于父節(jié)點(diǎn),則上??;最小堆則相反。
六、堆調(diào)整的應(yīng)用場景
(一)優(yōu)先隊(duì)列實(shí)現(xiàn)
1.任務(wù)調(diào)度:
-按任務(wù)優(yōu)先級(如緊急程度)排序,優(yōu)先處理高優(yōu)先級任務(wù)。
-插入新任務(wù)時(shí),O(logn)時(shí)間調(diào)整隊(duì)列。
2.事件處理:
-在游戲引擎中,按事件發(fā)生時(shí)間排序,實(shí)時(shí)響應(yīng)事件。
(二)堆排序算法
1.排序步驟:
a.構(gòu)建最大堆(或最小堆)。
b.重復(fù)執(zhí)行以下操作:
-刪除根節(jié)點(diǎn)(最大值),移至數(shù)組末尾。
-調(diào)整數(shù)組,重新構(gòu)建堆。
c.最終數(shù)組為有序序列。
2.時(shí)間復(fù)雜度:
-構(gòu)建堆:O(n)。
-n次刪除操作:O(nlogn)。
-總復(fù)雜度:O(nlogn)。
(三)圖算法輔助
1.Dijkstra算法優(yōu)化:
-使用最小堆管理待訪問節(jié)點(diǎn),按距離排序。
-插入/刪除節(jié)點(diǎn)時(shí),O(logn)時(shí)間更新優(yōu)先級。
2.A搜索算法:
-結(jié)合啟發(fā)式函數(shù),使用最大堆優(yōu)先處理最優(yōu)路徑候選。
(四)動態(tài)數(shù)據(jù)管理
1.最大/最小元素緩存:
-實(shí)時(shí)維護(hù)數(shù)據(jù)流中的最大/最小值。
-插入新元素時(shí),O(logn)時(shí)間更新堆頂。
2.TopK問題:
-快速找到數(shù)據(jù)集中前K個最大/最小元素。
-使用大小為K的最小堆,遍歷數(shù)據(jù):
a.若堆未滿,直接插入。
b.若堆滿且當(dāng)前元素大于堆頂,替換堆頂并下沉調(diào)整。
-最終堆頂為第K大/小值。
一、堆的基本概念
堆是一種特殊的樹形數(shù)據(jù)結(jié)構(gòu),通常用數(shù)組實(shí)現(xiàn)。堆具有以下關(guān)鍵特性:
(一)堆形狀特性
1.堆必須是一棵完全二叉樹。
2.完全二叉樹的定義:除最后一層外,每一層都是滿的,且最后一層節(jié)點(diǎn)從左到右連續(xù)排列。
(二)堆值特性
1.最大堆(MaxHeap):父節(jié)點(diǎn)值始終大于或等于子節(jié)點(diǎn)值。
2.最小堆(MinHeap):父節(jié)點(diǎn)值始終小于或等于子節(jié)點(diǎn)值。
二、堆的調(diào)整規(guī)則
堆的調(diào)整是指將一個無序的數(shù)組重新排列成符合堆特性的結(jié)構(gòu)。調(diào)整分為兩種場景:
(一)從無序數(shù)組構(gòu)建堆
1.自底向上調(diào)整(Bottom-UpHeapify)
(1)從最后一個非葉子節(jié)點(diǎn)開始調(diào)整。
(2)每個節(jié)點(diǎn)依次向上調(diào)整至根節(jié)點(diǎn),確保滿足堆特性。
(3)調(diào)整步驟:
a.初始化當(dāng)前節(jié)點(diǎn)為最后一個非葉子節(jié)點(diǎn)。
b.比較當(dāng)前節(jié)點(diǎn)與左右子節(jié)點(diǎn),找到最大(或最?。┲倒?jié)點(diǎn)。
c.若當(dāng)前節(jié)點(diǎn)不是最大(或最?。┲?,則與最大(或最?。┲倒?jié)點(diǎn)交換。
d.將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn),重復(fù)b-c步驟,直到到達(dá)根節(jié)點(diǎn)。
2.自頂向下調(diào)整(Top-DownHeapify)
(1)從根節(jié)點(diǎn)開始調(diào)整。
(2)每個節(jié)點(diǎn)依次向下調(diào)整至葉子節(jié)點(diǎn),確保滿足堆特性。
(3)調(diào)整步驟:
a.初始化當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn)。
b.比較當(dāng)前節(jié)點(diǎn)與左右子節(jié)點(diǎn),找到最大(或最?。┲倒?jié)點(diǎn)。
c.若當(dāng)前節(jié)點(diǎn)不是最大(或最?。┲?,則與最大(或最?。┲倒?jié)點(diǎn)交換。
d.將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn),重復(fù)b-c步驟,直到到達(dá)葉子節(jié)點(diǎn)。
(二)堆的插入操作
1.插入步驟
(1)將新元素添加到數(shù)組的末尾(保持完全二叉樹形狀)。
(2)通過上浮調(diào)整(BubbleUp)將新元素與父節(jié)點(diǎn)比較并交換,直到滿足堆特性。
(3)上浮調(diào)整步驟:
a.初始化當(dāng)前節(jié)點(diǎn)為插入位置。
b.比較當(dāng)前節(jié)點(diǎn)與父節(jié)點(diǎn),若不滿足堆特性則交換。
c.將當(dāng)前節(jié)點(diǎn)更新為被交換的父節(jié)點(diǎn),重復(fù)a-b步驟,直到到達(dá)根節(jié)點(diǎn)或滿足堆特性。
(三)堆的刪除操作
1.刪除步驟
(1)將根節(jié)點(diǎn)替換為數(shù)組的最后一個元素(保持完全二叉樹形狀)。
(2)通過下沉調(diào)整(BubbleDown)將根節(jié)點(diǎn)與子節(jié)點(diǎn)比較并交換,直到滿足堆特性。
(3)下沉調(diào)整步驟:
a.初始化當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn)。
b.比較當(dāng)前節(jié)點(diǎn)與左右子節(jié)點(diǎn),找到最大(或最?。┲倒?jié)點(diǎn)。
c.若當(dāng)前節(jié)點(diǎn)不是最大(或最小)值,則與最大(或最小)值節(jié)點(diǎn)交換。
d.將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn),重復(fù)a-c步驟,直到到達(dá)葉子節(jié)點(diǎn)或滿足堆特性。
三、堆調(diào)整的效率分析
(一)時(shí)間復(fù)雜度
1.從無序數(shù)組構(gòu)建堆:
-自底向上調(diào)整:O(n),其中n為節(jié)點(diǎn)數(shù)量。
-自頂向下調(diào)整:O(nlogn),效率較低。
2.插入操作:O(logn),需上浮調(diào)整。
3.刪除操作:O(logn),需下沉調(diào)整。
(二)空間復(fù)雜度
1.所有操作均原地修改數(shù)組,空間復(fù)雜度為O(1)。
四、應(yīng)用場景
1.優(yōu)先隊(duì)列實(shí)現(xiàn)。
2.堆排序算法的基礎(chǔ)。
3.貪心算法中的狀態(tài)管理。
4.圖算法中的最小/最大生成樹計(jì)算。
一、堆的基本概念
堆是一種特殊的樹形數(shù)據(jù)結(jié)構(gòu),通常用數(shù)組實(shí)現(xiàn)。堆具有以下關(guān)鍵特性:
(一)堆形狀特性
1.堆必須是一棵完全二叉樹。
-完全二叉樹的定義:除最后一層外,每一層都是滿的,且最后一層節(jié)點(diǎn)從左到右連續(xù)排列。
-數(shù)組表示法中,節(jié)點(diǎn)的索引與其子節(jié)點(diǎn)索引存在固定關(guān)系,便于快速訪問。
-對于索引為i的節(jié)點(diǎn):
-左子節(jié)點(diǎn)索引為`2i+1`。
-右子節(jié)點(diǎn)索引為`2i+2`。
-父節(jié)點(diǎn)索引為`(i-1)/2`(向下取整)。
(二)堆值特性
1.最大堆(MaxHeap):父節(jié)點(diǎn)值始終大于或等于子節(jié)點(diǎn)值。
-應(yīng)用場景:快速獲取最大值。
-示例:在數(shù)組中,根節(jié)點(diǎn)(索引0)存儲最大值。
2.最小堆(MinHeap):父節(jié)點(diǎn)值始終小于或等于子節(jié)點(diǎn)值。
-應(yīng)用場景:快速獲取最小值。
-示例:在數(shù)組中,根節(jié)點(diǎn)(索引0)存儲最小值。
三、堆的調(diào)整規(guī)則
堆的調(diào)整是指將一個無序的數(shù)組重新排列成符合堆特性的結(jié)構(gòu)。調(diào)整分為兩種場景:
(一)從無序數(shù)組構(gòu)建堆
1.自底向上調(diào)整(Bottom-UpHeapify)
-適用于從空堆逐步添加元素,或從完全二叉樹的葉子節(jié)點(diǎn)向上構(gòu)建堆。
-優(yōu)勢:時(shí)間復(fù)雜度為O(n),效率較高。
-具體步驟:
(1)確定起始調(diào)整節(jié)點(diǎn):
-從最后一個非葉子節(jié)點(diǎn)開始調(diào)整。
-非葉子節(jié)點(diǎn)計(jì)算公式:`start_index=(n-2)/2`,其中n為數(shù)組長度。
(2)逐個節(jié)點(diǎn)向上調(diào)整:
-從`start_index`開始,依次向上遍歷至根節(jié)點(diǎn)(索引0)。
-對于每個節(jié)點(diǎn)i:
a.比較與交換:
-比較節(jié)點(diǎn)i與其左右子節(jié)點(diǎn)(`2i+1`和`2i+2`)。
-找出三個節(jié)點(diǎn)中的最大值(在最大堆中),或最小值(在最小堆中)。
-若節(jié)點(diǎn)i不是最大/最小值,則與最大/最小子節(jié)點(diǎn)交換。
b.更新當(dāng)前節(jié)點(diǎn):
-將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn)(交換后子節(jié)點(diǎn)可能不再滿足堆特性)。
-重復(fù)比較與交換,直到節(jié)點(diǎn)i為葉子節(jié)點(diǎn)或滿足堆特性。
(3)終止條件:
-當(dāng)遍歷至根節(jié)點(diǎn)且所有節(jié)點(diǎn)均滿足堆特性時(shí),構(gòu)建完成。
2.自頂向下調(diào)整(Top-DownHeapify)
-適用于從有序數(shù)組轉(zhuǎn)換為堆,或刪除根節(jié)點(diǎn)后重新調(diào)整。
-優(yōu)勢:代碼實(shí)現(xiàn)簡單,但時(shí)間復(fù)雜度為O(nlogn),效率較低。
-具體步驟:
(1)初始化當(dāng)前節(jié)點(diǎn):
-從根節(jié)點(diǎn)(索引0)開始。
(2)逐個節(jié)點(diǎn)向下調(diào)整:
-對于每個節(jié)點(diǎn)i:
a.比較與交換:
-比較節(jié)點(diǎn)i與其左右子節(jié)點(diǎn)。
-找出最大/最小子節(jié)點(diǎn)。
-若節(jié)點(diǎn)i不是最大/最小值,則與最大/最小子節(jié)點(diǎn)交換。
b.更新當(dāng)前節(jié)點(diǎn):
-將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn)。
-重復(fù)比較與交換,直到當(dāng)前節(jié)點(diǎn)為葉子節(jié)點(diǎn)或滿足堆特性。
(3)終止條件:
-當(dāng)遍歷至最后一個葉子節(jié)點(diǎn)且所有節(jié)點(diǎn)均滿足堆特性時(shí),調(diào)整完成。
(二)堆的插入操作
1.插入步驟
-目標(biāo):將一個新元素添加到堆中,并保持堆特性。
-具體步驟:
(1)添加元素:
-將新元素添加到數(shù)組的末尾(保持完全二叉樹形狀)。
-例如,在最大堆中,新元素初始值可能小于根節(jié)點(diǎn),需要調(diào)整。
(2)上浮調(diào)整(BubbleUp):
-初始化當(dāng)前節(jié)點(diǎn)為插入位置(數(shù)組末尾)。
-比較當(dāng)前節(jié)點(diǎn)與父節(jié)點(diǎn):
a.若當(dāng)前節(jié)點(diǎn)值大于父節(jié)點(diǎn)值(最大堆),或小于父節(jié)點(diǎn)值(最小堆),則交換。
b.若不滿足交換條件,則停止調(diào)整。
-將當(dāng)前節(jié)點(diǎn)更新為被交換的父節(jié)點(diǎn),重復(fù)比較與交換,直到到達(dá)根節(jié)點(diǎn)或滿足堆特性。
(3)終止條件:
-當(dāng)當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn),或父節(jié)點(diǎn)值大于/小于當(dāng)前節(jié)點(diǎn)值時(shí),插入完成。
(三)堆的刪除操作
1.刪除步驟
-目標(biāo):刪除堆頂元素(根節(jié)點(diǎn)),并保持堆特性。
-具體步驟:
(1)替換根節(jié)點(diǎn):
-將數(shù)組的最后一個元素移動到根節(jié)點(diǎn)位置(覆蓋原根節(jié)點(diǎn))。
-數(shù)組長度減1,保持完全二叉樹形狀。
(2)下沉調(diào)整(BubbleDown):
-初始化當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn)。
-比較當(dāng)前節(jié)點(diǎn)與左右子節(jié)點(diǎn):
a.找出最大/最小子節(jié)點(diǎn)。
b.若當(dāng)前節(jié)點(diǎn)不是最大/最小值,則與最大/最小子節(jié)點(diǎn)交換。
c.將當(dāng)前節(jié)點(diǎn)更新為被交換的子節(jié)點(diǎn)。
-重復(fù)比較與交換,直到當(dāng)前節(jié)點(diǎn)為葉子節(jié)點(diǎn)或滿足堆特性。
(3)終止條件:
-當(dāng)當(dāng)前節(jié)點(diǎn)為葉子節(jié)點(diǎn),或左右子節(jié)點(diǎn)不存在(即無子節(jié)點(diǎn)),下沉調(diào)整完成。
三、堆調(diào)整的效率分析
(一)時(shí)間復(fù)雜度
1.從無序數(shù)組構(gòu)建堆:
-自底向上調(diào)整:O(n),可通過數(shù)學(xué)證明優(yōu)化。
-自頂向下調(diào)整:O(nlogn),適用于少量節(jié)點(diǎn)調(diào)整。
2.插入操作:O(logn),需上浮調(diào)整。
3.刪除操作:O(logn),需下沉調(diào)整。
(二)空間復(fù)雜度
1.所有操作均原地修改數(shù)組,空間復(fù)雜度為O(1)。
四、堆調(diào)整的優(yōu)化技巧
(一)減少比較次數(shù)
1.提前終止:
-在上浮/下沉調(diào)整中,若交換后父節(jié)點(diǎn)/子節(jié)點(diǎn)值相等,可提前終止。
2.懶惰比較:
-記錄最后一次交換的位置,后續(xù)調(diào)整僅在該位置以下進(jìn)行比較。
(二)避免重復(fù)計(jì)算
1.緩存子節(jié)點(diǎn)值:
-在下沉調(diào)整中,可先計(jì)算左右子節(jié)點(diǎn)值,再進(jìn)行比較,避免多次訪問子節(jié)點(diǎn)。
2.索引偏移:
-對于固定大小的數(shù)組,可預(yù)計(jì)算父/子節(jié)點(diǎn)索引偏移量,減少除法運(yùn)算。
(三)并行化處理
1.分塊調(diào)整:
-將堆劃分為多個區(qū)塊,并行執(zhí)行上浮/下
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車隊(duì)安全培訓(xùn)照片課件
- 氮及其化合物的試題與答案
- 車間質(zhì)量安全培訓(xùn)課件
- 車間級安全生產(chǎn)培訓(xùn)課件
- 《核能》物理授課課件
- 酒店客房預(yù)訂與取消制度
- 2026年內(nèi)蒙古自治區(qū)呼和浩特市輔警人員招聘考試試卷及答案
- 銀行客戶信息保護(hù)制度
- 2026年調(diào)度個人年度工作總結(jié)(2篇)
- 車間安全行車培訓(xùn)課件
- 鈀金的選礦工藝
- 人工智能在金融策略中的應(yīng)用
- JCT640-2010 頂進(jìn)施工法用鋼筋混凝土排水管
- 赤壁賦的議論文800字(實(shí)用8篇)
- 輸變電工程技術(shù)標(biāo)書【實(shí)用文檔】doc
- 南部山區(qū)仲宮街道鄉(xiāng)村建設(shè)規(guī)劃一張表
- 加工中心點(diǎn)檢表
- GB/T 2652-1989焊縫及熔敷金屬拉伸試驗(yàn)方法
- GB/T 25630-2010透平壓縮機(jī)性能試驗(yàn)規(guī)程
- GB/T 19668.1-2014信息技術(shù)服務(wù)監(jiān)理第1部分:總則
評論
0/150
提交評論