數(shù)據(jù)結(jié)構(gòu)-二叉堆

二叉堆的定義:

二叉堆是一顆完全二叉樹(shù)。

完全二叉樹(shù):把元素順序排列成樹(shù)的形狀。這里的順序是自上而下,從左到右。

二叉堆

最大堆:

????最大堆是一種特殊的二叉堆,頂部為最大元素,并且每個(gè)子樹(shù)的根節(jié)點(diǎn)大于等于左右孩子節(jié)點(diǎn)。

最大堆性質(zhì)

? ? 我們可以用數(shù)組來(lái)存放最大堆的每個(gè)元素,如下圖:

數(shù)組存儲(chǔ)二叉堆

其中,根節(jié)點(diǎn)的下標(biāo)為 0 ,每個(gè)子樹(shù)中父親節(jié)點(diǎn)和左右孩子節(jié)點(diǎn)的下標(biāo)關(guān)系為: parent(i) = (i - 1)/2;leftChild(i) = 2*i + 1;rightChild(i) = 2*i + 2。

最大堆的結(jié)構(gòu):

最大堆成員變量

泛型必須具有可比性。

最大堆的父親節(jié)點(diǎn)和左右孩子下標(biāo)的關(guān)系:

節(jié)點(diǎn)下標(biāo)關(guān)系

向最大堆添加元素:

????思路:首先向數(shù)組的末尾新增元素,然后比較新元素(末尾元素)的值與其父親元素的值,如果前者大于等于后者,則不符合最大堆的規(guī)則,需要上浮操作(交換二者的值),上浮操作完成之后,繼續(xù)對(duì)比,直到符合最大堆規(guī)則為止。

add(E e)

向最大堆取出元素(最大值):

????最大堆只能取出最大值,因?yàn)樗灰獫M足父親節(jié)點(diǎn)大于等于左右孩子就行了,所以左右孩子位置可以互換,即無(wú)法通過(guò)下標(biāo)找到其他節(jié)點(diǎn),這就是最大堆的限制。

? ? 思路:先在數(shù)組的頭部找出最大元素,然后讓數(shù)組的末尾元素替換頭部元素,并且刪除末尾元素。然后讓頭節(jié)點(diǎn)和其左右孩子中較大值進(jìn)行比較,如果前者小于后者,則需要下沉(交換二者的值)。下沉操作完成之后,繼續(xù)對(duì)比,直到符合最大堆規(guī)則為止。

extactMax

向最大堆中取出最大元素后,放入一個(gè)新元素:

? ? 思路:找到數(shù)組的頭部的,將新元素替換為頭部元素,然后執(zhí)行下沉操作。

replace(E e)

將任意數(shù)組整理成最大堆的形狀:

????思路:使用構(gòu)造函數(shù),將傳入的數(shù)組轉(zhuǎn)換為集合并賦值給 data,然后找到最后一個(gè)非葉子的節(jié)點(diǎn)(最后一個(gè)元素的父親節(jié)點(diǎn)),即 index = parent(arr.length - 1),從最后一個(gè)非葉子結(jié)點(diǎn)開(kāi)始往上遍歷,執(zhí)行下沉操作。因?yàn)橄鲁敛僮鲿?huì)涉及到左右孩子,所以已經(jīng)能夠比較到所有元素了。

數(shù)組轉(zhuǎn)最大堆

將最大堆封裝成優(yōu)先隊(duì)列PriorityQueue:

優(yōu)先隊(duì)列:普通隊(duì)列為先進(jìn)先出,然而優(yōu)先隊(duì)列出隊(duì)列卻是優(yōu)先度最高的元素,

優(yōu)先度是可以根據(jù)業(yè)務(wù)自定義的。我們就可以約定元素值越大,優(yōu)先級(jí)越高。故最大堆可以很容易的符合,因?yàn)樗淖畲笤鼐褪菙?shù)組首位。

優(yōu)先隊(duì)列
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學(xué)在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,138評(píng)論 0 12
  • ? 數(shù)據(jù)結(jié)構(gòu) 數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)和組織數(shù)據(jù)的的方式 1. 數(shù)組 在Java中,數(shù)組是用來(lái)存放同一種數(shù)據(jù)類型的集合...
    欲火逢生閱讀 520評(píng)論 0 3
  • 四. 走向世界之巔——快速排序 你可能會(huì)以為歸并排序是最強(qiáng)的算法了,其實(shí)不然?;叵胍幌拢瑲w并的時(shí)間效率雖然高,但空...
    Leesper閱讀 1,747評(píng)論 9 7
  • 數(shù)據(jù)結(jié)構(gòu)與算法--優(yōu)先隊(duì)列和堆排序 在某些數(shù)據(jù)處理的例子中,總數(shù)據(jù)量太大,無(wú)法排序(甚至無(wú)法全部裝進(jìn)內(nèi)存)。例如,...
    sunhaiyu閱讀 1,048評(píng)論 0 2
  • 地鐵里吵架好像蠻多的。只要經(jīng)常坐總會(huì)遇到幾次。吵架的危害最大是對(duì)周遭人群,大家揣著一天之初的好心情出門就遇到窩心腳...
    花園里的皮皮閱讀 143評(píng)論 0 0