1 定義如下:首先堆樹(shù)是一個(gè)完全二叉樹(shù) 其次堆中的某個(gè)節(jié)點(diǎn)總是大于或者小于其孩子節(jié)點(diǎn)的值 最后堆樹(shù)中每個(gè)節(jié)點(diǎn)的子樹(shù)都是堆樹(shù)
補(bǔ)充:
完全二叉樹(shù)(Complete Binary Tree): 每層結(jié)點(diǎn)都完全填滿书妻,在最后一層上如果不是滿的,則只缺少右邊的若干結(jié)點(diǎn)。
完美二叉樹(shù)(Perfect Binary Tree) 所有的非葉子結(jié)點(diǎn)都有兩個(gè)孩子糟袁,所有的葉子結(jié)點(diǎn)都在同一層未巫。
2 最大堆 最小堆
3 堆樹(shù)的操作
原始數(shù)據(jù)采用順序存儲(chǔ)方式
最大堆的構(gòu)造:待學(xué)習(xí)
樹(shù)的節(jié)點(diǎn)個(gè)數(shù)是n扫皱,以1為下標(biāo)開(kāi)始編號(hào)埠胖,直到n結(jié)束间聊,對(duì)于節(jié)點(diǎn)I,其父節(jié)點(diǎn)為i/2族购,左孩子為i*2,右孩子節(jié)點(diǎn)為i*2+1壳贪;最后一個(gè)節(jié)點(diǎn)為N,其父節(jié)點(diǎn)為n/2
用priorityQueue(優(yōu)先隊(duì)列),一個(gè)基于優(yōu)先級(jí)堆的無(wú)界優(yōu)先隊(duì)列寝杖。最大堆和最小堆實(shí)際上是一個(gè)堆违施,不指定comparator時(shí)默認(rèn)最小堆,通過(guò)傳入自定義的Comparator函數(shù)可以實(shí)現(xiàn)大頂堆
PriorityQueue minHeap = new PriorityQueue(); //小頂堆瑟幕,默認(rèn)容量為11
PriorityQueue maxHeap = new PriorityQueue(11,new Comparator(){ //大頂堆磕蒲,容量11
????@Override
????public int compare(Integer i1,Integer i2){
????????return i2-i1;
????}
});
常見(jiàn)操作:
poll(),offer(Object),size(),peek()等留潦。
插入方法(offer()、poll()辣往、remove() 兔院、add() 方法)時(shí)間復(fù)雜度為O(log(n)) ;
remove(Object) 和 contains(Object) 時(shí)間復(fù)雜度為O(n)排吴;
檢索方法(peek秆乳、element 和 size)時(shí)間復(fù)雜度為常量。
API文檔說(shuō)明:
構(gòu)造方法摘要PriorityQueue()
方法摘要??add()指定元素插入到此優(yōu)先隊(duì)列中???remove()移除指定元素clear()移除所有元素 offer()插入元素到隊(duì)列??peek()和poll()前者獲取 后者獲取并且移除
解決TOP k 問(wèn)題
優(yōu)先隊(duì)列是不同于先進(jìn)先出隊(duì)列的另外一種隊(duì)列钻哩。每次從隊(duì)列中取出的都是具有最高優(yōu)先權(quán)的元素屹堰。默認(rèn)自然順序排列,也可以根據(jù)Comparator來(lái)指定
優(yōu)先隊(duì)列不允許NULL元素街氢,不允許插入不可比較的對(duì)象
用add一個(gè)個(gè)加上去扯键,自動(dòng)給你排好序
注意1 該隊(duì)列是用數(shù)組實(shí)現(xiàn)的,但是數(shù)組的大小可以動(dòng)態(tài)增加珊肃,容量無(wú)限
注意2 此實(shí)現(xiàn)是不同步的
注意3 不允許使用null元素
注意4 插入方法(offer()荣刑、poll()、remove() 伦乔、add() 方法)時(shí)間復(fù)雜度為O(log(n)) 厉亏;
remove(Object) 和 contains(Object) 時(shí)間復(fù)雜度為O(n);
檢索方法(peek烈和、element 和 size)時(shí)間復(fù)雜度為常量爱只。
排序的主要有兩種:快速排序和基于堆實(shí)現(xiàn)的優(yōu)先級(jí)隊(duì)列 求Top K 更簡(jiǎn)單的方法可以直接使用內(nèi)置的Treemap或者treeset 這兩者都是基于紅黑樹(shù)的一種數(shù)據(jù)結(jié)構(gòu)
,每次添加新元素招刹,其排序的開(kāi)銷(xiāo)都要大于對(duì)調(diào)整的開(kāi)銷(xiāo)恬试,堆化