堆的基本操作和應(yīng)用制度_第1頁(yè)
堆的基本操作和應(yīng)用制度_第2頁(yè)
堆的基本操作和應(yīng)用制度_第3頁(yè)
堆的基本操作和應(yīng)用制度_第4頁(yè)
堆的基本操作和應(yīng)用制度_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

堆的基本操作和應(yīng)用制度一、堆的基本概念

堆是一種特殊的樹(shù)形數(shù)據(jù)結(jié)構(gòu),通常采用二叉樹(shù)的形式實(shí)現(xiàn)。堆的主要特征如下:

(一)堆的結(jié)構(gòu)特點(diǎn)

1.完全二叉樹(shù):堆是一種完全二叉樹(shù),即除了最后一層,其他層都是滿的,且最后一層的節(jié)點(diǎn)從左到右連續(xù)排列。

2.堆屬性:堆分為兩種類型——最大堆和最小堆。最大堆中,父節(jié)點(diǎn)的值總是大于或等于子節(jié)點(diǎn)的值;最小堆中,父節(jié)點(diǎn)的值總是小于或等于子節(jié)點(diǎn)的值。

(二)堆的存儲(chǔ)方式

1.數(shù)組存儲(chǔ):堆通常使用數(shù)組進(jìn)行存儲(chǔ),根節(jié)點(diǎn)存儲(chǔ)在數(shù)組的第一個(gè)位置(如索引0),其子節(jié)點(diǎn)分別存儲(chǔ)在索引1和索引2,以此類推。

2.父子關(guān)系:對(duì)于索引為i的節(jié)點(diǎn),其左子節(jié)點(diǎn)的索引為2i+1,右子節(jié)點(diǎn)的索引為2i+2;其父節(jié)點(diǎn)的索引為(i-1)/2(向下取整)。

二、堆的基本操作

堆的基本操作包括插入、刪除、調(diào)整等,以下是具體步驟:

(一)插入操作

1.插入位置:將新節(jié)點(diǎn)添加到數(shù)組的末尾,保持完全二叉樹(shù)的特性。

2.上浮調(diào)整:新節(jié)點(diǎn)與其父節(jié)點(diǎn)進(jìn)行比較,如果違反堆屬性(如最大堆中父節(jié)點(diǎn)小于新節(jié)點(diǎn)),則交換位置,直到滿足堆屬性或到達(dá)根節(jié)點(diǎn)。

-Step1:將新節(jié)點(diǎn)添加到數(shù)組末尾。

-Step2:初始化父節(jié)點(diǎn)索引為(新節(jié)點(diǎn)索引-1)/2。

-Step3:比較新節(jié)點(diǎn)與父節(jié)點(diǎn),若新節(jié)點(diǎn)更大(最大堆),則交換。

-Step4:更新父節(jié)點(diǎn)索引,重復(fù)步驟3,直到滿足堆屬性或到達(dá)根節(jié)點(diǎn)。

(二)刪除操作

1.刪除根節(jié)點(diǎn):移除數(shù)組的第一個(gè)元素(根節(jié)點(diǎn))。

2.下沉調(diào)整:將數(shù)組最后一個(gè)元素移動(dòng)到根節(jié)點(diǎn)位置,然后進(jìn)行下沉調(diào)整,確保堆屬性。

-Step1:移除數(shù)組第一個(gè)元素。

-Step2:將數(shù)組最后一個(gè)元素移動(dòng)到根節(jié)點(diǎn)位置。

-Step3:初始化子節(jié)點(diǎn)索引為2(左子節(jié)點(diǎn))。

-Step4:比較當(dāng)前節(jié)點(diǎn)與子節(jié)點(diǎn),若當(dāng)前節(jié)點(diǎn)小于子節(jié)點(diǎn)中的較大者(最大堆),則交換。

-Step5:更新子節(jié)點(diǎn)索引(切換到右子節(jié)點(diǎn)),重復(fù)步驟4,直到滿足堆屬性或無(wú)子節(jié)點(diǎn)。

(三)堆調(diào)整操作

1.目的:在已知部分?jǐn)?shù)組不滿足堆屬性時(shí),調(diào)整整個(gè)數(shù)組使其滿足堆屬性。

2.應(yīng)用場(chǎng)景:刪除操作后的下沉調(diào)整,以及構(gòu)建初始堆時(shí)。

-Step1:從指定節(jié)點(diǎn)開(kāi)始,初始化子節(jié)點(diǎn)索引為2。

-Step2:比較當(dāng)前節(jié)點(diǎn)與子節(jié)點(diǎn),若當(dāng)前節(jié)點(diǎn)小于子節(jié)點(diǎn)中的較大者(最大堆),則交換。

-Step3:更新子節(jié)點(diǎn)索引(切換到右子節(jié)點(diǎn)),重復(fù)步驟2,直到滿足堆屬性或無(wú)子節(jié)點(diǎn)。

三、堆的應(yīng)用制度

堆在多個(gè)領(lǐng)域有廣泛應(yīng)用,以下是主要應(yīng)用場(chǎng)景和制度:

(一)優(yōu)先隊(duì)列

1.定義:堆是實(shí)現(xiàn)優(yōu)先隊(duì)列的高效數(shù)據(jù)結(jié)構(gòu),其中堆頂元素始終是優(yōu)先級(jí)最高的元素。

2.應(yīng)用:

-任務(wù)調(diào)度:在操作系統(tǒng)中,堆用于管理任務(wù)隊(duì)列,優(yōu)先處理高優(yōu)先級(jí)任務(wù)。

-最小/最大堆:根據(jù)需求選擇最小堆或最大堆,如Dijkstra算法中使用最小堆記錄最短路徑。

(二)堆排序

1.原理:利用堆的結(jié)構(gòu)特性實(shí)現(xiàn)高效的排序算法。

2.步驟:

-Step1:構(gòu)建初始堆,將待排序數(shù)組調(diào)整為最大堆。

-Step2:重復(fù)執(zhí)行刪除操作,每次刪除堆頂元素并調(diào)整堆,直到堆為空。

-Step3:刪除的元素依次放入新數(shù)組,得到最終排序結(jié)果。

3.時(shí)間復(fù)雜度:O(nlogn),其中n為元素?cái)?shù)量。

(三)圖形算法

1.應(yīng)用:堆在圖形算法中用于優(yōu)化搜索過(guò)程,如A算法中結(jié)合堆管理開(kāi)放列表。

2.優(yōu)勢(shì):通過(guò)堆快速獲取當(dāng)前最優(yōu)解,顯著提升算法效率。

(四)數(shù)據(jù)流處理

1.場(chǎng)景:在實(shí)時(shí)數(shù)據(jù)流中,堆用于維護(hù)當(dāng)前最大的k個(gè)元素。

2.實(shí)現(xiàn):使用最小堆存儲(chǔ)k個(gè)元素,新元素進(jìn)入時(shí)與堆頂比較,若更大則替換并調(diào)整堆。

四、堆的性能分析

堆的操作具有高效的時(shí)間復(fù)雜度,以下是詳細(xì)分析:

(一)時(shí)間復(fù)雜度

1.插入操作:O(logn),由于需要上浮調(diào)整。

2.刪除操作:O(logn),由于需要下沉調(diào)整。

3.堆調(diào)整:O(n),構(gòu)建初始堆或部分調(diào)整時(shí)。

(二)空間復(fù)雜度

1.堆使用數(shù)組存儲(chǔ),空間復(fù)雜度為O(n),其中n為元素?cái)?shù)量。

(三)應(yīng)用效率

1.優(yōu)先隊(duì)列:平均情況下的操作時(shí)間為O(logn),適用于高并發(fā)場(chǎng)景。

2.堆排序:總時(shí)間復(fù)雜度為O(nlogn),適用于中等規(guī)模數(shù)據(jù)排序。

一、堆的基本概念

堆是一種特殊的樹(shù)形數(shù)據(jù)結(jié)構(gòu),通常采用二叉樹(shù)的形式實(shí)現(xiàn)。它是一種完全二叉樹(shù),具有獨(dú)特的堆屬性,使其在優(yōu)先隊(duì)列、排序等領(lǐng)域有廣泛應(yīng)用。理解堆的基本概念是掌握其操作和應(yīng)用的基礎(chǔ)。

(一)堆的結(jié)構(gòu)特點(diǎn)

1.完全二叉樹(shù):堆是一種完全二叉樹(shù),即除了最后一層,其他層都是滿的,且最后一層的節(jié)點(diǎn)從左到右連續(xù)排列。這種結(jié)構(gòu)保證了堆的高效存儲(chǔ)和操作。

-具體而言,對(duì)于一個(gè)堆,其第k層的節(jié)點(diǎn)數(shù)最多為2^(k-1)。對(duì)于高度為h的堆,其節(jié)點(diǎn)總數(shù)n滿足2^(h-1)-1<n<=2^h-1。

2.堆屬性:堆分為兩種類型——最大堆和最小堆。最大堆中,父節(jié)點(diǎn)的值總是大于或等于子節(jié)點(diǎn)的值;最小堆中,父節(jié)點(diǎn)的值總是小于或等于子節(jié)點(diǎn)的值。

-最大堆的性質(zhì)意味著堆頂元素(根節(jié)點(diǎn))是整個(gè)堆中值最大的元素。

-最小堆的性質(zhì)則意味著堆頂元素是整個(gè)堆中值最小的元素。

-堆屬性的這種特性,使得堆在優(yōu)先隊(duì)列等應(yīng)用中非常高效。

(二)堆的存儲(chǔ)方式

1.數(shù)組存儲(chǔ):堆通常使用數(shù)組進(jìn)行存儲(chǔ),根節(jié)點(diǎn)存儲(chǔ)在數(shù)組的第一個(gè)位置(如索引0),其子節(jié)點(diǎn)分別存儲(chǔ)在索引1和索引2,以此類推。

-這種存儲(chǔ)方式利用了數(shù)組的連續(xù)內(nèi)存特性,避免了鏈?zhǔn)酱鎯?chǔ)的指針開(kāi)銷,提高了訪問(wèn)效率。

-例如,對(duì)于索引為i的節(jié)點(diǎn),其左子節(jié)點(diǎn)的索引為2i+1,右子節(jié)點(diǎn)的索引為2i+2;其父節(jié)點(diǎn)的索引為(i-1)/2(向下取整)。

2.父子關(guān)系:對(duì)于索引為i的節(jié)點(diǎn),其左子節(jié)點(diǎn)的索引為2i+1,右子節(jié)點(diǎn)的索引為2i+2;其父節(jié)點(diǎn)的索引為(i-1)/2(向下取整)。這種固定的父子關(guān)系使得在數(shù)組中快速定位節(jié)點(diǎn)的父節(jié)點(diǎn)和子節(jié)點(diǎn)成為可能,這是堆操作的核心。

-例如,在數(shù)組[10,20,15,30,40,50,25]中,索引為0的節(jié)點(diǎn)10是根節(jié)點(diǎn),索引為1的節(jié)點(diǎn)20是節(jié)點(diǎn)10的左子節(jié)點(diǎn),索引為2的節(jié)點(diǎn)15是節(jié)點(diǎn)10的右子節(jié)點(diǎn),以此類推。

二、堆的基本操作

堆的基本操作包括插入、刪除、調(diào)整等,這些操作是堆應(yīng)用的基礎(chǔ)。以下是具體步驟和詳細(xì)說(shuō)明:

(一)插入操作

插入操作是將一個(gè)新元素添加到堆中,并保持堆屬性。具體步驟如下:

1.插入位置:將新節(jié)點(diǎn)添加到數(shù)組的末尾,保持完全二叉樹(shù)的特性。

-這是因?yàn)閿?shù)組存儲(chǔ)的堆是完全二叉樹(shù),末尾位置總是空的,可以用來(lái)存放新節(jié)點(diǎn)。

2.上浮調(diào)整:新節(jié)點(diǎn)與其父節(jié)點(diǎn)進(jìn)行比較,如果違反堆屬性(如最大堆中父節(jié)點(diǎn)小于新節(jié)點(diǎn)),則交換位置,直到滿足堆屬性或到達(dá)根節(jié)點(diǎn)。

-上浮調(diào)整是為了將新插入的節(jié)點(diǎn)調(diào)整到合適的位置,確保堆屬性成立。

-具體步驟如下:

-Step1:將新節(jié)點(diǎn)添加到數(shù)組末尾。例如,如果數(shù)組當(dāng)前為[10,20,15,30,40],插入一個(gè)值為25的新節(jié)點(diǎn),數(shù)組變?yōu)閇10,20,15,30,40,25]。

-Step2:初始化父節(jié)點(diǎn)索引為(新節(jié)點(diǎn)索引-1)/2。新節(jié)點(diǎn)索引為5,父節(jié)點(diǎn)索引為(5-1)/2=2。

-Step3:比較新節(jié)點(diǎn)與父節(jié)點(diǎn),若新節(jié)點(diǎn)更大(最大堆),則交換。這里,新節(jié)點(diǎn)25大于父節(jié)點(diǎn)15,所以交換,數(shù)組變?yōu)閇10,20,25,30,40,15]。

-Step4:更新父節(jié)點(diǎn)索引,重復(fù)步驟3,直到滿足堆屬性或到達(dá)根節(jié)點(diǎn)。父節(jié)點(diǎn)索引更新為(2-1)/2=0,新節(jié)點(diǎn)25與父節(jié)點(diǎn)10比較,25更大,交換,數(shù)組變?yōu)閇25,20,10,30,40,15]?,F(xiàn)在新節(jié)點(diǎn)是根節(jié)點(diǎn),滿足堆屬性,上浮調(diào)整結(jié)束。

(二)刪除操作

刪除操作通常指刪除堆頂元素(最大堆的堆頂或最小堆的堆頂),并保持堆屬性。具體步驟如下:

1.刪除根節(jié)點(diǎn):移除數(shù)組的第一個(gè)元素(根節(jié)點(diǎn))。

-刪除堆頂元素是因?yàn)槎秧斣厥莾?yōu)先級(jí)最高的,刪除后需要重新調(diào)整堆以找到新的堆頂元素。

2.下沉調(diào)整:將數(shù)組最后一個(gè)元素移動(dòng)到根節(jié)點(diǎn)位置,然后進(jìn)行下沉調(diào)整,確保堆屬性。

-下沉調(diào)整是為了將新根節(jié)點(diǎn)調(diào)整到合適的位置,確保堆屬性成立。

-具體步驟如下:

-Step1:移除數(shù)組第一個(gè)元素。例如,如果數(shù)組當(dāng)前為[25,20,10,30,40,15],刪除根節(jié)點(diǎn)25,數(shù)組變?yōu)閇20,10,30,40,15]。

-Step2:將數(shù)組最后一個(gè)元素移動(dòng)到根節(jié)點(diǎn)位置。最后一個(gè)元素是15,移動(dòng)到根節(jié)點(diǎn)位置,數(shù)組變?yōu)閇15,10,30,40,20]。

-Step3:初始化子節(jié)點(diǎn)索引為2(左子節(jié)點(diǎn))。根節(jié)點(diǎn)15的左子節(jié)點(diǎn)是10,索引為2。

-Step4:比較當(dāng)前節(jié)點(diǎn)與子節(jié)點(diǎn),若當(dāng)前節(jié)點(diǎn)小于子節(jié)點(diǎn)中的較大者(最大堆),則交換。這里,當(dāng)前節(jié)點(diǎn)15小于子節(jié)點(diǎn)10和30中的較大者30,所以與子節(jié)點(diǎn)30交換,數(shù)組變?yōu)閇30,10,15,40,20]。

-Step5:更新子節(jié)點(diǎn)索引(切換到右子節(jié)點(diǎn)),重復(fù)步驟4,直到滿足堆屬性或無(wú)子節(jié)點(diǎn)。更新子節(jié)點(diǎn)索引為3(右子節(jié)點(diǎn)),根節(jié)點(diǎn)30的右子節(jié)點(diǎn)是40,索引為3。當(dāng)前節(jié)點(diǎn)30小于子節(jié)點(diǎn)40,所以與子節(jié)點(diǎn)40交換,數(shù)組變?yōu)閇40,10,15,30,20]。更新子節(jié)點(diǎn)索引為6,但索引6已經(jīng)超出數(shù)組范圍,說(shuō)明節(jié)點(diǎn)40已經(jīng)沒(méi)有子節(jié)點(diǎn),下沉調(diào)整結(jié)束。

(三)堆調(diào)整操作

堆調(diào)整操作是指將一個(gè)已知部分不滿足堆屬性的堆調(diào)整為一個(gè)滿足堆屬性的堆。這在構(gòu)建初始堆或刪除操作后的調(diào)整中非常有用。具體步驟如下:

1.目的:在已知部分?jǐn)?shù)組不滿足堆屬性時(shí),調(diào)整整個(gè)數(shù)組使其滿足堆屬性。

-例如,在構(gòu)建初始堆時(shí),除了葉節(jié)點(diǎn)(最后一個(gè)非葉節(jié)點(diǎn)及其后的節(jié)點(diǎn))已經(jīng)滿足堆屬性外,其他節(jié)點(diǎn)可能不滿足堆屬性,需要通過(guò)堆調(diào)整操作來(lái)調(diào)整。

2.應(yīng)用場(chǎng)景:構(gòu)建初始堆時(shí),以及刪除操作后的下沉調(diào)整。

-構(gòu)建初始堆時(shí),通常從最后一個(gè)非葉節(jié)點(diǎn)開(kāi)始,逐步向上進(jìn)行堆調(diào)整,直到根節(jié)點(diǎn)。

-刪除操作后,需要進(jìn)行下沉調(diào)整,這也是堆調(diào)整操作的一種應(yīng)用。

3.具體步驟:

-Step1:從指定節(jié)點(diǎn)開(kāi)始,初始化子節(jié)點(diǎn)索引為2(左子節(jié)點(diǎn))。這是為了找到當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn),進(jìn)行后續(xù)比較和交換。

-Step2:比較當(dāng)前節(jié)點(diǎn)與子節(jié)點(diǎn),若當(dāng)前節(jié)點(diǎn)小于子節(jié)點(diǎn)中的較大者(最大堆),則交換。這是為了確保當(dāng)前節(jié)點(diǎn)滿足堆屬性,如果當(dāng)前節(jié)點(diǎn)不滿足,則需要與較大的子節(jié)點(diǎn)交換。

-Step3:更新子節(jié)點(diǎn)索引(切換到右子節(jié)點(diǎn)),重復(fù)步驟2,直到滿足堆屬性或無(wú)子節(jié)點(diǎn)。這是為了繼續(xù)向上調(diào)整,確保父節(jié)點(diǎn)也滿足堆屬性。如果當(dāng)前節(jié)點(diǎn)已經(jīng)滿足堆屬性,或者沒(méi)有子節(jié)點(diǎn)(即當(dāng)前節(jié)點(diǎn)是葉節(jié)點(diǎn)),則堆調(diào)整結(jié)束。

三、堆的應(yīng)用制度

堆在多個(gè)領(lǐng)域有廣泛應(yīng)用,其高效的操作特性使其在解決各種問(wèn)題中發(fā)揮重要作用。以下是主要應(yīng)用場(chǎng)景和具體制度:

(一)優(yōu)先隊(duì)列

1.定義:堆是實(shí)現(xiàn)優(yōu)先隊(duì)列的高效數(shù)據(jù)結(jié)構(gòu),其中堆頂元素始終是優(yōu)先級(jí)最高的元素(最大堆),或者優(yōu)先級(jí)最低的元素(最小堆)。

-優(yōu)先隊(duì)列是一種抽象數(shù)據(jù)類型,它支持兩種主要操作:插入元素和刪除具有最高優(yōu)先級(jí)的元素。

-堆通過(guò)其堆屬性保證了堆頂元素始終是優(yōu)先級(jí)最高的元素,從而實(shí)現(xiàn)了高效的優(yōu)先隊(duì)列操作。

2.應(yīng)用:

-任務(wù)調(diào)度:在操作系統(tǒng)中,堆用于管理任務(wù)隊(duì)列,優(yōu)先處理高優(yōu)先級(jí)任務(wù)。

-具體制度:

-Step1:將所有任務(wù)按照優(yōu)先級(jí)放入最小堆(優(yōu)先級(jí)越低,堆頂元素優(yōu)先級(jí)越高)。

-Step2:當(dāng)系統(tǒng)空閑時(shí),從堆頂取出優(yōu)先級(jí)最高的任務(wù)(即堆頂元素)執(zhí)行。

-Step3:執(zhí)行完畢后,如果還有其他任務(wù),重復(fù)步驟2。

-最小/最大堆:根據(jù)需求選擇最小堆或最大堆,如Dijkstra算法中使用最小堆記錄最短路徑。

-Dijkstra算法用于在圖中找到單源最短路徑。

-具體制度:

-Step1:使用最小堆存儲(chǔ)待訪問(wèn)的頂點(diǎn)及其到起點(diǎn)的距離。

-Step2:從堆頂取出距離起點(diǎn)最近的頂點(diǎn),并將其標(biāo)記為已訪問(wèn)。

-Step3:更新該頂點(diǎn)相鄰頂點(diǎn)的距離,如果更新后的距離更短,則將其放入堆中。

-Step4:重復(fù)步驟2和3,直到所有頂點(diǎn)都被訪問(wèn)。

(二)堆排序

1.原理:利用堆的結(jié)構(gòu)特性實(shí)現(xiàn)高效的排序算法。堆排序是一種基于堆結(jié)構(gòu)的比較排序算法,其基本思想是將待排序數(shù)組構(gòu)建成一個(gè)最大堆,然后將堆頂元素與數(shù)組末尾元素交換,再對(duì)剩下的元素重新構(gòu)建最大堆,如此反復(fù),最終得到一個(gè)有序數(shù)組。

2.步驟:

-Step1:構(gòu)建初始堆,將待排序數(shù)組調(diào)整為最大堆。

-具體方法:

-從最后一個(gè)非葉節(jié)點(diǎn)開(kāi)始,逐步向上進(jìn)行堆調(diào)整操作,直到根節(jié)點(diǎn)。

-這樣可以確保整個(gè)數(shù)組滿足最大堆屬性。

-Step2:重復(fù)執(zhí)行刪除操作,每次刪除堆頂元素并調(diào)整堆,直到堆為空。

-具體方法:

-每次刪除堆頂元素(即當(dāng)前最大元素)并將其與數(shù)組末尾元素交換。

-然后對(duì)剩下的元素(除了最后一個(gè)元素)進(jìn)行堆調(diào)整操作,重新構(gòu)建最大堆。

-Step3:刪除的元素依次放入新數(shù)組,得到最終排序結(jié)果。

-具體方法:

-將每次刪除的堆頂元素按順序放入一個(gè)新數(shù)組中。

-這樣,新數(shù)組就是原始數(shù)組的一個(gè)升序排列。

3.時(shí)間復(fù)雜度:O(nlogn),其中n為元素?cái)?shù)量。

-構(gòu)建初始堆的時(shí)間復(fù)雜度為O(n)。

-每次刪除操作和堆調(diào)整的時(shí)間復(fù)雜度為O(logn)。

-總共需要進(jìn)行n次刪除操作,因此總時(shí)間復(fù)雜度為O(nlogn)。

(三)圖形算法

1.應(yīng)用:堆在圖形算法中用于優(yōu)化搜索過(guò)程,如A算法中結(jié)合堆管理開(kāi)放列表。

-A算法是一種啟發(fā)式搜索算法,用于在圖中找到從起點(diǎn)到終點(diǎn)的最短路徑。

-開(kāi)放列表用于存儲(chǔ)待訪問(wèn)的節(jié)點(diǎn),堆可以高效地管理開(kāi)放列表,確保每次從開(kāi)放列表中取出的節(jié)點(diǎn)都是當(dāng)前最優(yōu)解。

2.優(yōu)勢(shì):通過(guò)堆快速獲取當(dāng)前最優(yōu)解,顯著提升算法效率。

-具體優(yōu)勢(shì):

-堆可以保證每次從開(kāi)放列表中取出的節(jié)點(diǎn)都是當(dāng)前最優(yōu)解,從而避免了不必要的搜索。

-堆的高效操作特性(插入、刪除、調(diào)整的時(shí)間復(fù)雜度均為O(logn))使得A算法能夠快速地處理大量節(jié)點(diǎn),提升算法效率。

(四)數(shù)據(jù)流處理

1.場(chǎng)景:在實(shí)時(shí)數(shù)據(jù)流中,堆用于維護(hù)當(dāng)前最大的k個(gè)元素。

-實(shí)時(shí)數(shù)據(jù)流處理是指對(duì)實(shí)時(shí)到達(dá)的數(shù)據(jù)進(jìn)行快速處理和分析。

-例如,在金融領(lǐng)域,需要對(duì)實(shí)時(shí)股票價(jià)格進(jìn)行分析,找出當(dāng)前最高的k支股票。

2.實(shí)現(xiàn):使用最小堆存儲(chǔ)k個(gè)元素,新元素進(jìn)入時(shí)與堆頂比較,若更大則替換并調(diào)整堆。

-具體制度:

-Step1:初始化一個(gè)大小為k的最小堆。

-Step2:當(dāng)新元素到達(dá)時(shí),將其與堆頂元素比較。

-Step3:如果新元素更大,則將堆頂元素替換為新元素,并對(duì)堆進(jìn)行堆調(diào)整操作。

-Step4:如果新元素不大于堆頂元素,則忽略該元素。

-Step5:重復(fù)步驟2-4,直到處理完所有元素。

-這樣,堆中始終維護(hù)著當(dāng)前最大的k個(gè)元素。

四、堆的性能分析

堆的操作具有高效的時(shí)間復(fù)雜度,這使得堆在許多應(yīng)用中非常受歡迎。以下是詳細(xì)分析:

(一)時(shí)間復(fù)雜度

1.插入操作:O(logn),由于需要上浮調(diào)整。

-上浮調(diào)整需要比較和交換節(jié)點(diǎn),最多需要進(jìn)行l(wèi)ogn次比較和交換,因此時(shí)間復(fù)雜度為O(logn)。

2.刪除操作:O(logn),由于需要下沉調(diào)整。

-下沉調(diào)整需要比較和交換節(jié)點(diǎn),最多需要進(jìn)行l(wèi)ogn次比較和交換,因此時(shí)間復(fù)雜度為O(logn)。

3.堆調(diào)整:O(n),構(gòu)建初始堆或部分調(diào)整時(shí)。

-構(gòu)建初始堆時(shí),需要從最后一個(gè)非葉節(jié)點(diǎn)開(kāi)始,逐步向上進(jìn)行堆調(diào)整操作,直到根節(jié)點(diǎn)。

-對(duì)于每個(gè)非葉節(jié)點(diǎn),需要進(jìn)行堆調(diào)整操作,而堆調(diào)整操作的時(shí)間復(fù)雜度為O(logn)。

-由于非葉節(jié)點(diǎn)的數(shù)量為n/2,因此構(gòu)建初始堆的時(shí)間復(fù)雜度為O(n)。

(二)空間復(fù)雜度

1.堆使用數(shù)組存儲(chǔ),空間復(fù)雜度為O(n),其中n為元素?cái)?shù)量。

-堆使用數(shù)組存儲(chǔ),需要連續(xù)的內(nèi)存空間來(lái)存儲(chǔ)所有元素,因此空間復(fù)雜度為O(n)。

-相比于鏈?zhǔn)酱鎯?chǔ),數(shù)組存儲(chǔ)可以避免指針開(kāi)銷,提高訪問(wèn)效率。

(三)應(yīng)用效率

1.優(yōu)先隊(duì)列:平均情況下的操作時(shí)間為O(logn),適用于高并發(fā)場(chǎng)景。

-在高并發(fā)場(chǎng)景中,需要快速地插入和刪除元素,而堆的高效操作特性可以滿足這一需求。

-例如,在任務(wù)調(diào)度中,可以使用堆來(lái)高效地管理任務(wù)隊(duì)列,確保高優(yōu)先級(jí)任務(wù)優(yōu)先執(zhí)行。

2.堆排序:總時(shí)間復(fù)雜度為O(nlogn),適用于中等規(guī)模數(shù)據(jù)排序。

-堆排序是一種高效的排序算法,適用于中等規(guī)模數(shù)據(jù)的排序。

-例如,對(duì)于包含數(shù)千個(gè)元素的數(shù)據(jù)集,堆排序可以快速地對(duì)其進(jìn)行排序。

總結(jié):堆是一種高效的數(shù)據(jù)結(jié)構(gòu),具有獨(dú)特的時(shí)間復(fù)雜度和空間復(fù)雜度特性,適用于多種應(yīng)用場(chǎng)景。通過(guò)深入理解堆的基本概念、操作和應(yīng)用制度,可以更好地利用堆來(lái)解決實(shí)際問(wèn)題,提升算法效率。

一、堆的基本概念

堆是一種特殊的樹(shù)形數(shù)據(jù)結(jié)構(gòu),通常采用二叉樹(shù)的形式實(shí)現(xiàn)。堆的主要特征如下:

(一)堆的結(jié)構(gòu)特點(diǎn)

1.完全二叉樹(shù):堆是一種完全二叉樹(shù),即除了最后一層,其他層都是滿的,且最后一層的節(jié)點(diǎn)從左到右連續(xù)排列。

2.堆屬性:堆分為兩種類型——最大堆和最小堆。最大堆中,父節(jié)點(diǎn)的值總是大于或等于子節(jié)點(diǎn)的值;最小堆中,父節(jié)點(diǎn)的值總是小于或等于子節(jié)點(diǎn)的值。

(二)堆的存儲(chǔ)方式

1.數(shù)組存儲(chǔ):堆通常使用數(shù)組進(jìn)行存儲(chǔ),根節(jié)點(diǎn)存儲(chǔ)在數(shù)組的第一個(gè)位置(如索引0),其子節(jié)點(diǎn)分別存儲(chǔ)在索引1和索引2,以此類推。

2.父子關(guān)系:對(duì)于索引為i的節(jié)點(diǎn),其左子節(jié)點(diǎn)的索引為2i+1,右子節(jié)點(diǎn)的索引為2i+2;其父節(jié)點(diǎn)的索引為(i-1)/2(向下取整)。

二、堆的基本操作

堆的基本操作包括插入、刪除、調(diào)整等,以下是具體步驟:

(一)插入操作

1.插入位置:將新節(jié)點(diǎn)添加到數(shù)組的末尾,保持完全二叉樹(shù)的特性。

2.上浮調(diào)整:新節(jié)點(diǎn)與其父節(jié)點(diǎn)進(jìn)行比較,如果違反堆屬性(如最大堆中父節(jié)點(diǎn)小于新節(jié)點(diǎn)),則交換位置,直到滿足堆屬性或到達(dá)根節(jié)點(diǎn)。

-Step1:將新節(jié)點(diǎn)添加到數(shù)組末尾。

-Step2:初始化父節(jié)點(diǎn)索引為(新節(jié)點(diǎn)索引-1)/2。

-Step3:比較新節(jié)點(diǎn)與父節(jié)點(diǎn),若新節(jié)點(diǎn)更大(最大堆),則交換。

-Step4:更新父節(jié)點(diǎn)索引,重復(fù)步驟3,直到滿足堆屬性或到達(dá)根節(jié)點(diǎn)。

(二)刪除操作

1.刪除根節(jié)點(diǎn):移除數(shù)組的第一個(gè)元素(根節(jié)點(diǎn))。

2.下沉調(diào)整:將數(shù)組最后一個(gè)元素移動(dòng)到根節(jié)點(diǎn)位置,然后進(jìn)行下沉調(diào)整,確保堆屬性。

-Step1:移除數(shù)組第一個(gè)元素。

-Step2:將數(shù)組最后一個(gè)元素移動(dòng)到根節(jié)點(diǎn)位置。

-Step3:初始化子節(jié)點(diǎn)索引為2(左子節(jié)點(diǎn))。

-Step4:比較當(dāng)前節(jié)點(diǎn)與子節(jié)點(diǎn),若當(dāng)前節(jié)點(diǎn)小于子節(jié)點(diǎn)中的較大者(最大堆),則交換。

-Step5:更新子節(jié)點(diǎn)索引(切換到右子節(jié)點(diǎn)),重復(fù)步驟4,直到滿足堆屬性或無(wú)子節(jié)點(diǎn)。

(三)堆調(diào)整操作

1.目的:在已知部分?jǐn)?shù)組不滿足堆屬性時(shí),調(diào)整整個(gè)數(shù)組使其滿足堆屬性。

2.應(yīng)用場(chǎng)景:刪除操作后的下沉調(diào)整,以及構(gòu)建初始堆時(shí)。

-Step1:從指定節(jié)點(diǎn)開(kāi)始,初始化子節(jié)點(diǎn)索引為2。

-Step2:比較當(dāng)前節(jié)點(diǎn)與子節(jié)點(diǎn),若當(dāng)前節(jié)點(diǎn)小于子節(jié)點(diǎn)中的較大者(最大堆),則交換。

-Step3:更新子節(jié)點(diǎn)索引(切換到右子節(jié)點(diǎn)),重復(fù)步驟2,直到滿足堆屬性或無(wú)子節(jié)點(diǎn)。

三、堆的應(yīng)用制度

堆在多個(gè)領(lǐng)域有廣泛應(yīng)用,以下是主要應(yīng)用場(chǎng)景和制度:

(一)優(yōu)先隊(duì)列

1.定義:堆是實(shí)現(xiàn)優(yōu)先隊(duì)列的高效數(shù)據(jù)結(jié)構(gòu),其中堆頂元素始終是優(yōu)先級(jí)最高的元素。

2.應(yīng)用:

-任務(wù)調(diào)度:在操作系統(tǒng)中,堆用于管理任務(wù)隊(duì)列,優(yōu)先處理高優(yōu)先級(jí)任務(wù)。

-最小/最大堆:根據(jù)需求選擇最小堆或最大堆,如Dijkstra算法中使用最小堆記錄最短路徑。

(二)堆排序

1.原理:利用堆的結(jié)構(gòu)特性實(shí)現(xiàn)高效的排序算法。

2.步驟:

-Step1:構(gòu)建初始堆,將待排序數(shù)組調(diào)整為最大堆。

-Step2:重復(fù)執(zhí)行刪除操作,每次刪除堆頂元素并調(diào)整堆,直到堆為空。

-Step3:刪除的元素依次放入新數(shù)組,得到最終排序結(jié)果。

3.時(shí)間復(fù)雜度:O(nlogn),其中n為元素?cái)?shù)量。

(三)圖形算法

1.應(yīng)用:堆在圖形算法中用于優(yōu)化搜索過(guò)程,如A算法中結(jié)合堆管理開(kāi)放列表。

2.優(yōu)勢(shì):通過(guò)堆快速獲取當(dāng)前最優(yōu)解,顯著提升算法效率。

(四)數(shù)據(jù)流處理

1.場(chǎng)景:在實(shí)時(shí)數(shù)據(jù)流中,堆用于維護(hù)當(dāng)前最大的k個(gè)元素。

2.實(shí)現(xiàn):使用最小堆存儲(chǔ)k個(gè)元素,新元素進(jìn)入時(shí)與堆頂比較,若更大則替換并調(diào)整堆。

四、堆的性能分析

堆的操作具有高效的時(shí)間復(fù)雜度,以下是詳細(xì)分析:

(一)時(shí)間復(fù)雜度

1.插入操作:O(logn),由于需要上浮調(diào)整。

2.刪除操作:O(logn),由于需要下沉調(diào)整。

3.堆調(diào)整:O(n),構(gòu)建初始堆或部分調(diào)整時(shí)。

(二)空間復(fù)雜度

1.堆使用數(shù)組存儲(chǔ),空間復(fù)雜度為O(n),其中n為元素?cái)?shù)量。

(三)應(yīng)用效率

1.優(yōu)先隊(duì)列:平均情況下的操作時(shí)間為O(logn),適用于高并發(fā)場(chǎng)景。

2.堆排序:總時(shí)間復(fù)雜度為O(nlogn),適用于中等規(guī)模數(shù)據(jù)排序。

一、堆的基本概念

堆是一種特殊的樹(shù)形數(shù)據(jù)結(jié)構(gòu),通常采用二叉樹(shù)的形式實(shí)現(xiàn)。它是一種完全二叉樹(shù),具有獨(dú)特的堆屬性,使其在優(yōu)先隊(duì)列、排序等領(lǐng)域有廣泛應(yīng)用。理解堆的基本概念是掌握其操作和應(yīng)用的基礎(chǔ)。

(一)堆的結(jié)構(gòu)特點(diǎn)

1.完全二叉樹(shù):堆是一種完全二叉樹(shù),即除了最后一層,其他層都是滿的,且最后一層的節(jié)點(diǎn)從左到右連續(xù)排列。這種結(jié)構(gòu)保證了堆的高效存儲(chǔ)和操作。

-具體而言,對(duì)于一個(gè)堆,其第k層的節(jié)點(diǎn)數(shù)最多為2^(k-1)。對(duì)于高度為h的堆,其節(jié)點(diǎn)總數(shù)n滿足2^(h-1)-1<n<=2^h-1。

2.堆屬性:堆分為兩種類型——最大堆和最小堆。最大堆中,父節(jié)點(diǎn)的值總是大于或等于子節(jié)點(diǎn)的值;最小堆中,父節(jié)點(diǎn)的值總是小于或等于子節(jié)點(diǎn)的值。

-最大堆的性質(zhì)意味著堆頂元素(根節(jié)點(diǎn))是整個(gè)堆中值最大的元素。

-最小堆的性質(zhì)則意味著堆頂元素是整個(gè)堆中值最小的元素。

-堆屬性的這種特性,使得堆在優(yōu)先隊(duì)列等應(yīng)用中非常高效。

(二)堆的存儲(chǔ)方式

1.數(shù)組存儲(chǔ):堆通常使用數(shù)組進(jìn)行存儲(chǔ),根節(jié)點(diǎn)存儲(chǔ)在數(shù)組的第一個(gè)位置(如索引0),其子節(jié)點(diǎn)分別存儲(chǔ)在索引1和索引2,以此類推。

-這種存儲(chǔ)方式利用了數(shù)組的連續(xù)內(nèi)存特性,避免了鏈?zhǔn)酱鎯?chǔ)的指針開(kāi)銷,提高了訪問(wèn)效率。

-例如,對(duì)于索引為i的節(jié)點(diǎn),其左子節(jié)點(diǎn)的索引為2i+1,右子節(jié)點(diǎn)的索引為2i+2;其父節(jié)點(diǎn)的索引為(i-1)/2(向下取整)。

2.父子關(guān)系:對(duì)于索引為i的節(jié)點(diǎn),其左子節(jié)點(diǎn)的索引為2i+1,右子節(jié)點(diǎn)的索引為2i+2;其父節(jié)點(diǎn)的索引為(i-1)/2(向下取整)。這種固定的父子關(guān)系使得在數(shù)組中快速定位節(jié)點(diǎn)的父節(jié)點(diǎn)和子節(jié)點(diǎn)成為可能,這是堆操作的核心。

-例如,在數(shù)組[10,20,15,30,40,50,25]中,索引為0的節(jié)點(diǎn)10是根節(jié)點(diǎn),索引為1的節(jié)點(diǎn)20是節(jié)點(diǎn)10的左子節(jié)點(diǎn),索引為2的節(jié)點(diǎn)15是節(jié)點(diǎn)10的右子節(jié)點(diǎn),以此類推。

二、堆的基本操作

堆的基本操作包括插入、刪除、調(diào)整等,這些操作是堆應(yīng)用的基礎(chǔ)。以下是具體步驟和詳細(xì)說(shuō)明:

(一)插入操作

插入操作是將一個(gè)新元素添加到堆中,并保持堆屬性。具體步驟如下:

1.插入位置:將新節(jié)點(diǎn)添加到數(shù)組的末尾,保持完全二叉樹(shù)的特性。

-這是因?yàn)閿?shù)組存儲(chǔ)的堆是完全二叉樹(shù),末尾位置總是空的,可以用來(lái)存放新節(jié)點(diǎn)。

2.上浮調(diào)整:新節(jié)點(diǎn)與其父節(jié)點(diǎn)進(jìn)行比較,如果違反堆屬性(如最大堆中父節(jié)點(diǎn)小于新節(jié)點(diǎn)),則交換位置,直到滿足堆屬性或到達(dá)根節(jié)點(diǎn)。

-上浮調(diào)整是為了將新插入的節(jié)點(diǎn)調(diào)整到合適的位置,確保堆屬性成立。

-具體步驟如下:

-Step1:將新節(jié)點(diǎn)添加到數(shù)組末尾。例如,如果數(shù)組當(dāng)前為[10,20,15,30,40],插入一個(gè)值為25的新節(jié)點(diǎn),數(shù)組變?yōu)閇10,20,15,30,40,25]。

-Step2:初始化父節(jié)點(diǎn)索引為(新節(jié)點(diǎn)索引-1)/2。新節(jié)點(diǎn)索引為5,父節(jié)點(diǎn)索引為(5-1)/2=2。

-Step3:比較新節(jié)點(diǎn)與父節(jié)點(diǎn),若新節(jié)點(diǎn)更大(最大堆),則交換。這里,新節(jié)點(diǎn)25大于父節(jié)點(diǎn)15,所以交換,數(shù)組變?yōu)閇10,20,25,30,40,15]。

-Step4:更新父節(jié)點(diǎn)索引,重復(fù)步驟3,直到滿足堆屬性或到達(dá)根節(jié)點(diǎn)。父節(jié)點(diǎn)索引更新為(2-1)/2=0,新節(jié)點(diǎn)25與父節(jié)點(diǎn)10比較,25更大,交換,數(shù)組變?yōu)閇25,20,10,30,40,15]?,F(xiàn)在新節(jié)點(diǎn)是根節(jié)點(diǎn),滿足堆屬性,上浮調(diào)整結(jié)束。

(二)刪除操作

刪除操作通常指刪除堆頂元素(最大堆的堆頂或最小堆的堆頂),并保持堆屬性。具體步驟如下:

1.刪除根節(jié)點(diǎn):移除數(shù)組的第一個(gè)元素(根節(jié)點(diǎn))。

-刪除堆頂元素是因?yàn)槎秧斣厥莾?yōu)先級(jí)最高的,刪除后需要重新調(diào)整堆以找到新的堆頂元素。

2.下沉調(diào)整:將數(shù)組最后一個(gè)元素移動(dòng)到根節(jié)點(diǎn)位置,然后進(jìn)行下沉調(diào)整,確保堆屬性。

-下沉調(diào)整是為了將新根節(jié)點(diǎn)調(diào)整到合適的位置,確保堆屬性成立。

-具體步驟如下:

-Step1:移除數(shù)組第一個(gè)元素。例如,如果數(shù)組當(dāng)前為[25,20,10,30,40,15],刪除根節(jié)點(diǎn)25,數(shù)組變?yōu)閇20,10,30,40,15]。

-Step2:將數(shù)組最后一個(gè)元素移動(dòng)到根節(jié)點(diǎn)位置。最后一個(gè)元素是15,移動(dòng)到根節(jié)點(diǎn)位置,數(shù)組變?yōu)閇15,10,30,40,20]。

-Step3:初始化子節(jié)點(diǎn)索引為2(左子節(jié)點(diǎn))。根節(jié)點(diǎn)15的左子節(jié)點(diǎn)是10,索引為2。

-Step4:比較當(dāng)前節(jié)點(diǎn)與子節(jié)點(diǎn),若當(dāng)前節(jié)點(diǎn)小于子節(jié)點(diǎn)中的較大者(最大堆),則交換。這里,當(dāng)前節(jié)點(diǎn)15小于子節(jié)點(diǎn)10和30中的較大者30,所以與子節(jié)點(diǎn)30交換,數(shù)組變?yōu)閇30,10,15,40,20]。

-Step5:更新子節(jié)點(diǎn)索引(切換到右子節(jié)點(diǎn)),重復(fù)步驟4,直到滿足堆屬性或無(wú)子節(jié)點(diǎn)。更新子節(jié)點(diǎn)索引為3(右子節(jié)點(diǎn)),根節(jié)點(diǎn)30的右子節(jié)點(diǎn)是40,索引為3。當(dāng)前節(jié)點(diǎn)30小于子節(jié)點(diǎn)40,所以與子節(jié)點(diǎn)40交換,數(shù)組變?yōu)閇40,10,15,30,20]。更新子節(jié)點(diǎn)索引為6,但索引6已經(jīng)超出數(shù)組范圍,說(shuō)明節(jié)點(diǎn)40已經(jīng)沒(méi)有子節(jié)點(diǎn),下沉調(diào)整結(jié)束。

(三)堆調(diào)整操作

堆調(diào)整操作是指將一個(gè)已知部分不滿足堆屬性的堆調(diào)整為一個(gè)滿足堆屬性的堆。這在構(gòu)建初始堆或刪除操作后的調(diào)整中非常有用。具體步驟如下:

1.目的:在已知部分?jǐn)?shù)組不滿足堆屬性時(shí),調(diào)整整個(gè)數(shù)組使其滿足堆屬性。

-例如,在構(gòu)建初始堆時(shí),除了葉節(jié)點(diǎn)(最后一個(gè)非葉節(jié)點(diǎn)及其后的節(jié)點(diǎn))已經(jīng)滿足堆屬性外,其他節(jié)點(diǎn)可能不滿足堆屬性,需要通過(guò)堆調(diào)整操作來(lái)調(diào)整。

2.應(yīng)用場(chǎng)景:構(gòu)建初始堆時(shí),以及刪除操作后的下沉調(diào)整。

-構(gòu)建初始堆時(shí),通常從最后一個(gè)非葉節(jié)點(diǎn)開(kāi)始,逐步向上進(jìn)行堆調(diào)整,直到根節(jié)點(diǎn)。

-刪除操作后,需要進(jìn)行下沉調(diào)整,這也是堆調(diào)整操作的一種應(yīng)用。

3.具體步驟:

-Step1:從指定節(jié)點(diǎn)開(kāi)始,初始化子節(jié)點(diǎn)索引為2(左子節(jié)點(diǎn))。這是為了找到當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn),進(jìn)行后續(xù)比較和交換。

-Step2:比較當(dāng)前節(jié)點(diǎn)與子節(jié)點(diǎn),若當(dāng)前節(jié)點(diǎn)小于子節(jié)點(diǎn)中的較大者(最大堆),則交換。這是為了確保當(dāng)前節(jié)點(diǎn)滿足堆屬性,如果當(dāng)前節(jié)點(diǎn)不滿足,則需要與較大的子節(jié)點(diǎn)交換。

-Step3:更新子節(jié)點(diǎn)索引(切換到右子節(jié)點(diǎn)),重復(fù)步驟2,直到滿足堆屬性或無(wú)子節(jié)點(diǎn)。這是為了繼續(xù)向上調(diào)整,確保父節(jié)點(diǎn)也滿足堆屬性。如果當(dāng)前節(jié)點(diǎn)已經(jīng)滿足堆屬性,或者沒(méi)有子節(jié)點(diǎn)(即當(dāng)前節(jié)點(diǎn)是葉節(jié)點(diǎn)),則堆調(diào)整結(jié)束。

三、堆的應(yīng)用制度

堆在多個(gè)領(lǐng)域有廣泛應(yīng)用,其高效的操作特性使其在解決各種問(wèn)題中發(fā)揮重要作用。以下是主要應(yīng)用場(chǎng)景和具體制度:

(一)優(yōu)先隊(duì)列

1.定義:堆是實(shí)現(xiàn)優(yōu)先隊(duì)列的高效數(shù)據(jù)結(jié)構(gòu),其中堆頂元素始終是優(yōu)先級(jí)最高的元素(最大堆),或者優(yōu)先級(jí)最低的元素(最小堆)。

-優(yōu)先隊(duì)列是一種抽象數(shù)據(jù)類型,它支持兩種主要操作:插入元素和刪除具有最高優(yōu)先級(jí)的元素。

-堆通過(guò)其堆屬性保證了堆頂元素始終是優(yōu)先級(jí)最高的元素,從而實(shí)現(xiàn)了高效的優(yōu)先隊(duì)列操作。

2.應(yīng)用:

-任務(wù)調(diào)度:在操作系統(tǒng)中,堆用于管理任務(wù)隊(duì)列,優(yōu)先處理高優(yōu)先級(jí)任務(wù)。

-具體制度:

-Step1:將所有任務(wù)按照優(yōu)先級(jí)放入最小堆(優(yōu)先級(jí)越低,堆頂元素優(yōu)先級(jí)越高)。

-Step2:當(dāng)系統(tǒng)空閑時(shí),從堆頂取出優(yōu)先級(jí)最高的任務(wù)(即堆頂元素)執(zhí)行。

-Step3:執(zhí)行完畢后,如果還有其他任務(wù),重復(fù)步驟2。

-最小/最大堆:根據(jù)需求選擇最小堆或最大堆,如Dijkstra算法中使用最小堆記錄最短路徑。

-Dijkstra算法用于在圖中找到單源最短路徑。

-具體制度:

-Step1:使用最小堆存儲(chǔ)待訪問(wèn)的頂點(diǎn)及其到起點(diǎn)的距離。

-Step2:從堆頂取出距離起點(diǎn)最近的頂點(diǎn),并將其標(biāo)記為已訪問(wèn)。

-Step3:更新該頂點(diǎn)相鄰頂點(diǎn)的距離,如果更新后的距離更短,則將其放入堆中。

-Step4:重復(fù)步驟2和3,直到所有頂點(diǎn)都被訪問(wèn)。

(二)堆排序

1.原理:利用堆的結(jié)構(gòu)特性實(shí)現(xiàn)高效的排序算法。堆排序是一種基于堆結(jié)構(gòu)的比較排序算法,其基本思想是將待排序數(shù)組構(gòu)建成一個(gè)最大堆,然后將堆頂元素與數(shù)組末尾元素交換,再對(duì)剩下的元素重新構(gòu)建最大堆,如此反復(fù),最終得到一個(gè)有序數(shù)組。

2.步驟:

-Step1:構(gòu)建初始堆,將待排序數(shù)組調(diào)整為最大堆。

-具體方法:

-從最后一個(gè)非葉節(jié)點(diǎn)開(kāi)始,逐步向上進(jìn)行堆調(diào)整操作,直到根節(jié)點(diǎn)。

-這樣可以確保整個(gè)數(shù)組滿足最大堆屬性。

-Step2:重復(fù)執(zhí)行刪除操作,每次刪除堆頂元素并調(diào)整堆,直到堆為空。

-具體方法:

-每次刪除堆頂元素(即當(dāng)前最大元素)并將其與數(shù)組末尾元素交換。

-然后對(duì)剩下的元素(除了最后一個(gè)元素)進(jìn)行堆調(diào)整操作,重新構(gòu)建最大堆。

-Step3:刪除的元素依次放入新數(shù)組,得到最終排序結(jié)果。

-具體方法:

-將每次刪除的堆頂元素按順序放入一個(gè)新數(shù)組中。

-這樣,新數(shù)組就是原始數(shù)組的一個(gè)升序排列。

3.時(shí)間復(fù)雜度:O(nlogn),其中n為元素?cái)?shù)量。

-構(gòu)建初始堆的時(shí)間復(fù)雜度為O(n)。

-每次刪除操作和堆調(diào)整的時(shí)間復(fù)雜度為O(logn)。

-總共需要進(jìn)行n次刪除操作,因此總時(shí)間復(fù)雜度為O

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論