chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

五張圖帶你體會堆算法

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:CSDN博客 ? 作者:NoMasp柯于旺 ? 2022-11-10 09:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

什么是堆

堆(heap),是一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱。它通常被看作一棵樹的數(shù)組對象。在隊(duì)列中,調(diào)度程序反復(fù)提取隊(duì)列中的第一個作業(yè)并運(yùn)行,因?yàn)閷?shí)際情況中某些時(shí)間較短的任務(wù)卻可能需要等待很長時(shí)間才能開始執(zhí)行,或者某些不短小、但很重要的作業(yè),同樣應(yīng)當(dāng)擁有優(yōu)先權(quán)。而堆就是為了解決此類問題而設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)。

二叉堆是一種特殊的堆,二叉堆是完全二叉樹或者近似完全二叉樹,二叉堆滿足堆特性:父節(jié)點(diǎn)的鍵值總是保持固定的序關(guān)系于任何一個子節(jié)點(diǎn)的鍵值,且每個節(jié)點(diǎn)的左子樹和右子樹都是一個二叉堆。

當(dāng)父節(jié)點(diǎn)的鍵值總是大于任何一個子節(jié)點(diǎn)的鍵值時(shí)為最大堆,當(dāng)父節(jié)點(diǎn)的鍵值總是小于或等于任何一個子節(jié)點(diǎn)的鍵值時(shí)為最小堆。

為了更加形象,我們常用帶數(shù)字的圓圈和線條來表示二叉堆等,但其實(shí)都是用數(shù)組來表示的。如果根節(jié)點(diǎn)在數(shù)組中的位置是1,第n個位置的子節(jié)點(diǎn)則分別在2n和2n+1位置上。

如下圖所描的,第2個位置的子節(jié)點(diǎn)在4和5,第4個位置的子節(jié)點(diǎn)在8和9。所以我們獲得父節(jié)點(diǎn)和子節(jié)點(diǎn)的方式如下:

PARENT(i)

1 return 小于或等于i/2的最大整數(shù)

LEFT-CHILD(i)

1 return 2i

RIGHT-CHILD(i)

1 return 2i+1

00c232ac-6096-11ed-8abf-dac502259ad0.png

假定表示堆的數(shù)組為A,那么A.length通常給出數(shù)組元素的個數(shù),A.heap?size表示有多少個堆元素存儲在該數(shù)組中。這句話略帶拗口,也就是說數(shù)組A[1...A.length]可能都有數(shù)據(jù)存放,但只有A[1...A.heap?size]中存放的數(shù)據(jù)才是堆中的有效數(shù)據(jù)。毫無疑問0≤A.heap?size≤A.length。

最大堆除了根以外所有結(jié)點(diǎn)i都滿足:A[PARENT(i)]≥A[i]。

最小堆除了根以外所有結(jié)點(diǎn)i都滿足:A[PARENT(i)]≤A[i]。

一個堆中結(jié)點(diǎn)的高度是該結(jié)點(diǎn)到葉借點(diǎn)最長簡單路徑上邊的數(shù)目,如上圖所示編號為4的結(jié)點(diǎn)的高度為1,編號為2的結(jié)點(diǎn)的高度為2,樹的高度就是3。

包含n個元素的隊(duì)可以看作一顆完全二叉樹,那么該堆的高度是Θ(lgn)。

通過MAX-HEAPIFY維護(hù)最大堆

程序中,不可能所有的堆都天生就是最大堆,為了更好的使用堆這一數(shù)據(jù)結(jié)構(gòu),我們可能要人為地構(gòu)造最大堆。

如何將一個雜亂排序的堆重新構(gòu)造成最大堆,它的主要思路是:

從上往下,將父節(jié)點(diǎn)與子節(jié)點(diǎn)以此比較。如果父節(jié)點(diǎn)最大則進(jìn)行下一步循環(huán),如果子節(jié)點(diǎn)更大,則將子節(jié)點(diǎn)與父節(jié)點(diǎn)位置互換,并進(jìn)行下一步循環(huán)。注意父節(jié)點(diǎn)要與兩個子節(jié)點(diǎn)都進(jìn)行比較。

00d8ab54-6096-11ed-8abf-dac502259ad0.png

如上圖說描述的,這里從結(jié)點(diǎn)為2開始做運(yùn)算。先去l為4,r為5,將其與父節(jié)點(diǎn)做比較,發(fā)現(xiàn)左子節(jié)點(diǎn)比父節(jié)點(diǎn)更大。因此將它們做交換,設(shè)4為最大的結(jié)點(diǎn),并繼續(xù)以結(jié)點(diǎn)4開始做下一步運(yùn)算。

因此可以給出偽代碼如下:

MAX-HEAPIFY(A,i)

1 l=LEFT-CHILD(i)

2 r=RIGHT-CHILD(i)

3 if l<=A.heap-size and A[l]>A[i]

4 largest=l

5 else

6 largest=i

7 if r<=A.heap-size and A[r]>A[largest]

8 largest=r

9 if largest != i

10 exchange A[i] with A[largest]

11 MAX-HEAPIFY(A,largest)

在以上這些步驟中,調(diào)整A[i]、A[l]、A[r]的關(guān)系的時(shí)間代價(jià)為Θ(1),再加上一棵以i的子節(jié)點(diǎn)為根結(jié)點(diǎn)的子樹上運(yùn)行MAX-HEAPIFY的時(shí)間代價(jià)(注意此處的遞歸不一定會發(fā)生,此處只是假設(shè)其發(fā)生)。因?yàn)槊總€子節(jié)點(diǎn)的子樹的大小至多為2n/3(最壞情況發(fā)生在樹的底層恰好半滿的時(shí)候)。因此MAX-HEAPIFY過程的運(yùn)行時(shí)間為:

T(n)≤T(2n/3)+Θ(1)

也就是:

T(n)=O(lgn)

通過BUILD-MAX-HEAP構(gòu)建最大堆

前面我們通過自頂向下的方式維護(hù)了一個最大堆,這里將通過自底向上的方式通過MAX-HEAPIFY將一個n=A.length的數(shù)組A[1...n]轉(zhuǎn)換成最大堆。

回顧一下上面的圖示,其總共有9個結(jié)點(diǎn),取小于或等于9/2的最大整數(shù)為4,從4+1,4+2,一直到n都是該樹的葉子結(jié)點(diǎn),你發(fā)現(xiàn)了么?這對任意n都是成立的哦。

因此這里我們就要從4開始不斷的調(diào)用MAX-HEAPIFY(A,i)來構(gòu)建最大堆。

為什么會有這一思路呢?

原因是既然我們知道了哪些結(jié)點(diǎn)是葉子結(jié)點(diǎn),從最后一個非葉子結(jié)點(diǎn)(這里是4)開始,一次調(diào)用MAX-HEAPIFY函數(shù),就會將該結(jié)點(diǎn)與葉子結(jié)點(diǎn)做相應(yīng)的調(diào)整,這其實(shí)也就是一個遞歸的過程。

00e6e8c2-6096-11ed-8abf-dac502259ad0.png

圖示已經(jīng)這么清晰了,就直接上偽代碼咯。

BUILD-MAX-HEAP(A)

1 A.heap-size=A.length

2 for i=小于或等于A.length/2的最大整數(shù) downto 1

3 MAX-HEAPIFY(A,i)

通過HEAPSORT進(jìn)行堆排序算法

所謂的堆排序算法,先通過前面的BUILD-MAX-HEAP將輸入數(shù)組A[1...n]建成最大堆,其中n=A.length。而數(shù)組中的元素總在根結(jié)點(diǎn)A[1]中,通過把它與A[n]進(jìn)行互換,就能將該元素放到正確的位置。

如何讓原來根的子結(jié)點(diǎn)仍然是最大堆呢,可以通過從堆中去掉結(jié)點(diǎn)n,而這可以通過減少A.heap?size來間接的完成。但這樣一來新的根節(jié)點(diǎn)就違背了最大堆的性質(zhì),因此仍然需要調(diào)用MAX-HEAPIFY(A,1),從而在A[1...n?1]上構(gòu)造一個新的最大堆。

通過不斷重復(fù)這一過程,知道堆的大小從n?1一直降到2即可。

020a5e50-6096-11ed-8abf-dac502259ad0.png

上圖的演進(jìn)方式主要有兩點(diǎn):

1)將A[1]和A[i]互換,i從A.length一直遞減到2

2)不斷調(diào)用MAX-HEAPIFY(A,1)對剩余的整個堆進(jìn)行重新構(gòu)建

一直到最后堆已經(jīng)不存在了。

HEAPSORT(A)

1 BUILD-MAX-HEAP(A)

2 for i=A.length downto 2

3 exchange A[1] with A[i]

4 A.heap-size=A.heap-size-1

5 MAX-HEAPIFY(A,1)

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

下一篇博文我們就會介紹大名鼎鼎的快排,快速排序啦,歡迎童鞋們預(yù)定哦~

話說堆排序雖然性能上不及快速排序,但作為一個盡心盡力的數(shù)據(jù)結(jié)構(gòu)而言,其可謂業(yè)界良心吶。它還為我們提供了傳說中的“優(yōu)先隊(duì)列”。

優(yōu)先隊(duì)列(priority queue)和堆一樣,堆有最大堆和最小堆,優(yōu)先隊(duì)列也有最大優(yōu)先隊(duì)列和最小優(yōu)先隊(duì)列。

優(yōu)先隊(duì)列是一種用來維護(hù)由一組元素構(gòu)成的集合S的數(shù)據(jù)結(jié)構(gòu),其中每個元素都有一個相關(guān)的值,稱之為關(guān)鍵字(key)。

一個最大優(yōu)先隊(duì)列支持一下操作:

MAXIMUM(S)返回S中有著最大鍵值的元素。

EXTRACT?MAX(S)去掉并返回S中的具有最大鍵字的元素。
INCREASE?KEY(S,x,a)將元素x的關(guān)鍵字值增加到a,這里假設(shè)a的值不小于x的原關(guān)鍵字值。
INSERT(S,x)將元素x插入集合S中,這一操作等價(jià)于S=S∪{x}。

這里來舉一個最大優(yōu)先隊(duì)列的示例,我曾在關(guān)于“50% CPU 占有率”題目的內(nèi)容擴(kuò)展 這篇博文中簡單介紹過Windows的系統(tǒng)進(jìn)程機(jī)制。

這里以圖片的形式簡單的貼出來如下:

022e0044-6096-11ed-8abf-dac502259ad0.png

在用堆實(shí)現(xiàn)優(yōu)先隊(duì)列時(shí),需要在堆中的每個元素里存儲對應(yīng)對象的句柄(handle)。句柄的準(zhǔn)確含義依賴于具體的應(yīng)用程序,可以是指針,也可以是整型數(shù)。

在堆的操作過程中,元素會改變其在數(shù)組中的位置,因此在具體實(shí)現(xiàn)中,在重新確定堆元素位置時(shí),就自然而然地需要改變其在數(shù)組中的位置。

一、前面的MAXIMUM(S)過程其實(shí)很簡單,完全可以在Θ(1)時(shí)間內(nèi)完成,因?yàn)橹恍枰祷財(cái)?shù)組的第一個元素就可以呀,它已經(jīng)是最大優(yōu)先隊(duì)列了嘛。

HEAP-MAXIMUM(A)

1 return A[1]

二、EXTRACT?MAX(S)就稍顯復(fù)雜了一點(diǎn),它的時(shí)間復(fù)雜度是O(lgn),因?yàn)檫@里面除了MAX-HEAPIFY(A,1)以外,其他的操作都是常量時(shí)間的。

HEAP-EXTRACT-MAX(A)

1 if A.heap-size < 1

2 error "堆下溢"

3 max=A[1]

4 A[1]=A[A.heap-size]

5 A.heap-size=A.heap-size-1

6 MAX-HEAPIFY(A,1)

7 return max

三、INCREASE?KEY(S,x,a)需要將一個大于元素x原有關(guān)鍵字值的a加到元素x上。

和上一個函數(shù)一樣,首先判斷a知否比原有的關(guān)鍵字更大。

然后就是老辦法了,不斷的將該結(jié)點(diǎn)與父結(jié)點(diǎn)做對比,如果父結(jié)點(diǎn)更小,那么就將他們進(jìn)行對換。

相信有圖示會更加清楚,于是……再來一張圖。

023fa4ca-6096-11ed-8abf-dac502259ad0.png

HEAP-INCREASE-KEY(A,i,key)

1 if key < A[i]

2 error "新關(guān)鍵字值比當(dāng)前關(guān)鍵字值更小"

3 A[i]=key

4 while i>1 and A[PARENT(i)] < A[i]

5 exchange A[i] with A[PARENT(I)]

6 i=PARENT(i)

在包含n個元素的堆上,HEAP-INCREASE-KEY的運(yùn)行時(shí)間就是O(lgn)了。因?yàn)樵诘?行做了關(guān)鍵字更新的結(jié)點(diǎn)到根結(jié)點(diǎn)的路徑長度為O(lgn)。

四、INSERT(S,x)首先通過一個特殊的關(guān)鍵字(比如這里的-10000擴(kuò)展)結(jié)點(diǎn)來擴(kuò)展最大堆,然后調(diào)用HEAP-INCREASE-KEY來為新的結(jié)點(diǎn)設(shè)置對應(yīng)的關(guān)鍵字,同時(shí)保持最大堆的性質(zhì)。

MAX-HEAP-INSERT(A,key)

1 A.heap-size=A.heap-sieze+1

2 A[A.heap-size]=-10000

3 HEAP-INCREASE-KEY(A,A.hep-size,key)

在包含n個元素的堆上,MAX-HEAP-INSERT的運(yùn)行時(shí)間就是O(lgn)了。因?yàn)檫@個算法相對于上一個算法,除了HEAP-INCREASE-KEY之外就都是常量的運(yùn)行時(shí)間了,而HEAP-INCREASE-KEY的運(yùn)行時(shí)間我們在上一部分已經(jīng)講過了。

總而言之,在一個包含n個元素的堆中,所有優(yōu)先隊(duì)列的操作時(shí)間都不會大于O(lgn)。

---END---

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4759

    瀏覽量

    97112
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    41345
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    420

    瀏覽量

    27104

原文標(biāo)題:五張圖帶你體會堆算法

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    和棧的區(qū)別

    一個由C/C 編譯的程序占用的內(nèi)存分為以下幾個部分: 棧區(qū)(stack):由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。 區(qū)(heap):一般由
    的頭像 發(fā)表于 11-27 18:13 ?887次閱讀

    國密系列算法簡介及SM4算法原理介紹

    一、 國密系列算法簡介 國家商用密碼算法(簡稱國密/商密算法),是由我國國家密碼管理局制定并公布的密碼算法標(biāo)準(zhǔn)。其分類1所示: 1
    發(fā)表于 10-24 08:25

    搞懂LDO的硬件設(shè)計(jì)和應(yīng)用

    存在誤解,這些誤解往往會導(dǎo)致設(shè)計(jì)失敗。? ” 我們先通過一來概括 LDO 的應(yīng)用: 線性穩(wěn)壓電源與 LDO 先澄清一個基礎(chǔ)的概念 : LDO 是線性穩(wěn)壓電源的一種 ,但不是所有線性穩(wěn)壓電源都是 LDO。兩者都是 通過 反饋控制環(huán)路 來實(shí)現(xiàn)穩(wěn)壓的
    的頭像 發(fā)表于 09-23 17:22 ?7897次閱讀
    一<b class='flag-5'>張</b><b class='flag-5'>圖</b>搞懂LDO的硬件設(shè)計(jì)和應(yīng)用

    能源數(shù)字化轉(zhuǎn)型核心!一揭秘綠電直連“流合一”超級架構(gòu)

    本文將化繁為簡,通過“源、網(wǎng)、荷、儲、碳”大核心要素,為您全景解析其系統(tǒng)架構(gòu),揭秘如何實(shí)現(xiàn)“流合一”的智慧協(xié)同。
    的頭像 發(fā)表于 09-17 17:07 ?454次閱讀
    能源數(shù)字化轉(zhuǎn)型核心!一<b class='flag-5'>張</b><b class='flag-5'>圖</b>揭秘綠電直連“<b class='flag-5'>五</b>流合一”超級架構(gòu)

    阿童木雙檢測器:金家電沖壓疊料檢測方案

    一、方案簡介當(dāng)前金家電行業(yè)(如洗衣機(jī)內(nèi)筒、冰箱門板、空調(diào)外機(jī)支架等沖壓件生產(chǎn))面臨“雙疊料導(dǎo)致模具損耗大、傳統(tǒng)檢測適配性差、多品種換產(chǎn)效率低”三大核心問題,直接影響生產(chǎn)效益與產(chǎn)品質(zhì)量。本方案
    的頭像 發(fā)表于 08-22 15:44 ?577次閱讀
    阿童木雙<b class='flag-5'>張</b>檢測器:<b class='flag-5'>五</b>金家電沖壓疊料檢測方案

    金沖壓行業(yè)雙檢測案例:阿童木 MDSC-900E 的智能識別與高速響應(yīng)應(yīng)用

    一、項(xiàng)目背景某金制造企業(yè)主營金屬零部件生產(chǎn),核心工序?yàn)殍F片沖壓成型。在沖壓前,需將0.8mm厚的鐵片通過送料機(jī)送入沖壓設(shè)備。此前因缺乏可靠的雙檢測手段,常出現(xiàn)鐵片重疊(雙或多張)送料的情況
    的頭像 發(fā)表于 06-17 16:16 ?416次閱讀
    <b class='flag-5'>五</b>金沖壓行業(yè)雙<b class='flag-5'>張</b>檢測案例:阿童木 MDSC-900E 的智能識別與高速響應(yīng)應(yīng)用

    阿童木通過式金屬雙檢測器:高速精準(zhǔn),重塑生產(chǎn)效能

    在金屬加工領(lǐng)域,雙疊料檢測是保障產(chǎn)線穩(wěn)定運(yùn)行的關(guān)鍵環(huán)節(jié)。阿童木通過式金屬雙檢測器以高速響應(yīng)、寬域檢測、抗干擾強(qiáng)、智能互聯(lián)四大核心優(yōu)勢,成為金家電、鋰電疊片、金屬包裝等行業(yè)的“效率守護(hù)者”。一
    的頭像 發(fā)表于 05-22 11:22 ?698次閱讀
    阿童木通過式金屬雙<b class='flag-5'>張</b>檢測器:高速精準(zhǔn),重塑生產(chǎn)效能

    高壓放大器在壓電疊主動隔振實(shí)驗(yàn)中的應(yīng)用

    作為傳感器件,并搭建了主動隔振系統(tǒng)試驗(yàn)平臺;(2)分別對鋼梁及平板結(jié)構(gòu)進(jìn)行模態(tài)測試試驗(yàn),驗(yàn)證有限元模型的真實(shí)性及可靠性;(3)MCS控制算法作為主動隔振系統(tǒng)的控制策略,進(jìn)行壓電疊主動隔振試驗(yàn)研究,結(jié)合數(shù)據(jù)處理軟件
    的頭像 發(fā)表于 04-10 11:16 ?533次閱讀
    高壓放大器在壓電疊<b class='flag-5'>堆</b>主動隔振實(shí)驗(yàn)中的應(yīng)用

    :整流電路的“中流砥柱”

    大家好!今天我們來聊一聊電子電路中一個非常重要的元器件——橋。無論是家用電器、工業(yè)設(shè)備,還是通信設(shè)備,橋都扮演著不可或缺的角色。它雖然看起來不起眼,但卻是整流電路的“中流砥柱”。那么,橋到底是
    的頭像 發(fā)表于 04-01 17:07 ?2111次閱讀

    一周帶你看懂電路

    教你看懂電路 電源電路單元 一電路通常有幾十乃至幾百個元器件,它們的連線縱橫交叉,形式變化多端,初 學(xué)者往往不知道該從什么地方開始, 怎樣才能讀懂它。其實(shí)電子電路本身有很強(qiáng)的規(guī)律性, 不管多
    發(fā)表于 03-03 15:05

    用DLP4500 exe軟件來對248bit的合成824bit的后,最后設(shè)置完sequence,play的時(shí)候就只顯示了8,為什么?

    Sequence Settting 設(shè)置時(shí)也是將248bit按順序加入到Pattern Sequence中,不知道為啥。
    發(fā)表于 02-25 07:52

    第四代核電型:鈉冷快設(shè)計(jì)的流體仿真技術(shù)挑戰(zhàn)與解決方案

    第四代核反應(yīng)是目前核能技術(shù)發(fā)展的前沿方向,具有更高的安全性、經(jīng)濟(jì)性、可持續(xù)性以及防擴(kuò)散能力等特點(diǎn)。
    的頭像 發(fā)表于 02-24 11:17 ?1693次閱讀
    第四代核電<b class='flag-5'>堆</b>型:鈉冷快<b class='flag-5'>堆</b>設(shè)計(jì)的流體仿真技術(shù)挑戰(zhàn)與解決方案

    用DLP4500燒錄98bit位深度的相移,3合成了一24bit,結(jié)果每一24bit都重復(fù)投射三次,這是為什么?

    你好,吳工,用DLP4500燒錄98bit位深度的相移,3合成了一24bit,結(jié)果每一24bit都重復(fù)投射三次,想問下這是為什么
    發(fā)表于 02-24 08:00

    取料機(jī)DCS數(shù)據(jù)采集物聯(lián)網(wǎng)解決方案

    在火電廠中,取料機(jī)承擔(dān)著儲存、輸送原料的重要任務(wù),通過PLC、DCS等執(zhí)行允許料、允許取料、外圍取料運(yùn)行、取料機(jī)緊急停機(jī)、料運(yùn)行、
    的頭像 發(fā)表于 12-24 10:23 ?801次閱讀
    <b class='flag-5'>堆</b>取料機(jī)DCS數(shù)據(jù)采集物聯(lián)網(wǎng)解決方案

    求助,ISO7721用于485隔離遇到的疑問求解

    是mA級的,所以是不是需要在輸出腳串一個K級的電組來限流? ②我查閱了TI所有跟ISO7X21的參考設(shè)計(jì)原理,其中沒有任何一原理串聯(lián)了上面描述的限流電阻,為什么?
    發(fā)表于 12-18 06:30