精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

堆和堆傻傻分不清?一文告訴你 Java 集合中「堆」的打開方式

開發 后端
普通的隊列游戲規則很簡單:就是先進先出;但這種優先隊列搞特殊,不是按照進隊列的時間順序,而是按照每個元素的優先級來比拼,優先級高的在堆頂。

[[333346]]

什么是堆?

堆其實就是一種特殊的隊列——優先隊列。

普通的隊列游戲規則很簡單:就是先進先出;但這種優先隊列搞特殊,不是按照進隊列的時間順序,而是按照每個元素的優先級來比拼,優先級高的在堆頂。

這也很容易理解吧,比如各種軟件都有會員制度,某軟件用了會員就能加速下載的,不同等級的會員速度還不一樣,那就是優先級不同呀。

還有其實每個人回復微信消息也是默默的把消息放進堆里排個序:先回男朋友女朋友的,然后再回其他人的。

這里要區別于操作系統里的那個“堆”,這兩個雖然都叫堆,但是沒有半毛錢關系,都是借用了 Heap 這個英文單詞而已。

 

我們再來回顧一下「堆」在整個 Java 集合框架中的位置:

 

也就是說,

  • PriorityQueue 是一個類 (class);
  • PriorityQueue 繼承自 Queue 這個接口 (Interface);

那 heap 在哪呢?

heap 其實是一個抽象的數據結構,或者說是邏輯上的數據結構,并不是一個物理上真實存在的數據結構。

heap 其實有很多種實現方式,比如 binomial heap, Fibonacci heap 等等。但是面試最常考的,也是最經典的,就是 binary heap 二叉堆,也就是用一棵完全二叉樹來實現的。

那完全二叉樹是怎么實現的?

其實是用數組來實現的!

所以 binary heap/PriorityQueue 實際上是用數組來實現的。

這個數組的排列方式有點特別,因為它總會維護你定義的(或者默認的)優先級最高的元素在數組的首位,所以不是隨便一個數組都叫「堆」,實際上,它在你心里,應該是一棵「完全二叉樹」。

這棵完全二叉樹,只存在你心里和各大書本上;實際在在內存里,哪有什么樹?就是數組罷了。

那為什么完全二叉樹可以用數組來實現?是不是所有的樹都能用數組來實現?

這個就涉及完全二叉樹的性質了,我們下一篇會細講,簡單來說,因為完全二叉樹的定義要求了它在層序遍歷的時候沒有氣泡,也就是連續存儲的,所以可以用數組來存放;第二個問題當然是否。

堆的特點

1.堆是一棵完全二叉樹;

2.堆序性 (heap order): 任意節點都優于它的所有孩子。

a. 如果是任意節點都大于它的所有孩子,這樣的堆叫大頂堆,Max Heap;

b. 如果是任意節點都小于它的所有孩子,這樣的堆叫小頂堆,Min Heap

 

左圖是小頂堆,可以看出對于每個節點來說,都是小于它的所有孩子的,注意是所有孩子,包括孫子,曾孫...

3.既然堆是用數組來實現的,那么我們可以找到每個節點和它的父母/孩子之間的關系,從而可以直接訪問到它們。

 

比如對于節點 3 來說,

  • 它的 Index = 1,
  • 它的 parent index = 0,
  • 左孩子 left child index = 3,
  • 右孩子 right child index = 4.

可以歸納出如下規律:

  • 設當前節點的 index = x,
  • 那么 parent index = (x-1)/2,
  • 左孩子 left child index = 2*x + 1,
  • 右孩子 right child index = 2*x + 2.

有些書上可能寫法稍有不同,是因為它們的數組是從 1 開始的,而我這里數組的下標是從 0 開始的,都是可以的。

這樣就可以從任意一個點,一步找到它的孫子、曾孫子,真的太方便了,在后文講具體操作時大家可以更深刻的體會到。

基本操作

任何一個數據結構,無非就是增刪改查四大類:

功能 方法 時間復雜度
offer(E e) O(logn)
poll() O(logn)
無直接的 API 刪 + 增
peek() O(1)

這里 peek() 的時間復雜度很好理解,因為堆的用途就是能夠快速的拿到一組數據里的最大/最小值,所以這一步的時間復雜度一定是 O(1) 的,這就是堆的意義所在。

那么我們具體來看 offer(E e) 和 poll() 的過程。

offer(E e)

比如我們新加一個 0 到剛才這個最小堆里面:

 

那很明顯,0 是要放在最上面的,可是,直接放上去就不是一棵完全二叉樹了啊。。

所以說,

  • 我們先保證加了元素之后這棵樹還是一棵完全二叉樹,
  • 然后再通過 swap 的方式進行微調,來滿足堆序性。

這樣就保證滿足了堆的兩個特點,也就是保證了加入新元素之后它還是個堆。

那具體怎么做呢:

Step 1.

先把 0 放在最后接上,別一上來就想著上位;

 

OK!總算先上岸了,然后我們再一步步往上走。

這里「能否往上走」的標準在于:

是否滿足堆序性。

也就是說,現在 5 和 0 之間不滿足堆序性,那么交換位置,換到直到滿足堆序性為止。

這里對于最小堆來說的堆序性,就是小的數要在上面。

Step 2. 與 5 交換

 

此時 0 和 3 不滿足堆序性了,那么再交換。

Step 3. 與 3 交換

 

還不行,0 還比 1 小,所以繼續換。

Step 4. 與 1 交換

 

OK!這樣就換好了,一個新的堆誕生了~

總結一下這個方法:

先把新元素加入數組的末尾,再通過不斷比較與 parent 的值的大小,決定是否交換,直到滿足堆序性為止。

這個過程就是 siftUp(),源碼如下:

 

 

 

 

時間復雜度

這里不難發現,其實我們只交換了一條支路上的元素,

 

也就是最多交換 O(height) 次。

那么對于完全二叉樹來說,除了最后一層都是滿的,O(height) = O(logn)。

所以 offer(E e) 的時間復雜度就是 O(logn) 啦。

poll()

poll() 就是把最頂端的元素拿走。

對了,沒有辦法拿走中間的元素,畢竟要 VIP 先出去,小弟才能出去。

那么最頂端元素拿走后,這個位置就空了:

 

我們還是先來滿足堆序性,因為比較容易滿足嘛,直接從最后面拿一個來補上就好了,先放個傀儡上來。

Step1. 末尾元素上位

 

這樣一來,堆序性又不滿足了,開始交換元素。

那 8 比 7 和 3 都大,應該和誰交換呢?

假設與 7 交換,那么 7 還是比 3 大,還得 7 和 3 換,麻煩。

所以是與左右孩子中較小的那個交換。

Step 2. 與 3 交換

 

下去之后,還比 5 和 4 大,那再和 4 換一下。

Step 3. 與 4 交換

 

OK!這樣這棵樹總算是穩定了。

總結一下這個方法:

先把數組的末位元素加到頂端,再通過不斷比較與左右孩子的值的大小,決定是否交換,直到滿足堆序性為止。

這個過程就是 siftDown(),源碼如下:

 

時間復雜度

同樣道理,也只交換了一條支路上的元素,也就是最多交換 O(height) 次。

所以 offer(E e) 的時間復雜度就是 O(logn) 啦。

heapify()

還有一個大名鼎鼎的非常重要的操作,就是 heapify() 了,它是一個很神奇的操作,

可以用 O(n) 的時間把一個亂序的數組變成一個 heap。

但是呢,heapify() 并不是一個 public API,看:

 

所以我們沒有辦法直接使用。

唯一使用 heapify() 的方式呢,就是使用PriorityQueue(Collection c)

這個 constructor 的時候,人家會自動調用 heapify() 這個操作。

那具體是怎么做的呢?

哈哈源碼已經暴露了:

從最后一個非葉子節點開始,從后往前做 siftDown().

因為葉子節點沒必要操作嘛,已經到了最下面了,還能和誰 swap?

舉個例子:

 

我們想把這個數組進行 heapify() 操作,想把它變成一個最小堆,拿到它的最小值。

那就要從 3 開始,對 3,7,5進行 siftDown().

Step 1.

 

尷尬 😅,3 并不用交換,因為以它為頂點的這棵小樹已經滿足了堆序性。

Step 2.

 

7 比它的兩個孩子都要大,所以和較小的那個交換一下。

交換完成后;

 

Step 3.

最后一個要處理的就是 5 了,那這里 5 比它的兩個孩子都要大,所以也和較小的那個交換一下。

 

換完之后結果如下,注意并沒有滿足堆序性,因為 4 還比 5 小呢。

 

所以接著和 4 換,結果如下:

 

這樣整個 heapify() 的過程就完成了。

好了難點來了,為什么時間復雜度是 O(n) 的呢?

怎么計算這個時間復雜度呢?

其實我們在這個過程里做的操作無非就是交換交換。

那到底交換了多少次呢?

沒錯,交換了多少次,時間復雜度就是多少。

那我們可以看出來,其實同一層的節點最多交換的次數都是相同的。

那么這個總的交換次數 = 每層的節點數 * 每個節點最多交換的次數

 

這里設 k 為層數,那么這個例子里 k=3.

 

所以 heapify() 時間復雜度是 O(n).

 

以上就是堆的三大重要操作,最后一個 heapify() 雖然不能直接操作,但是堆排序中用到了這種思路,之前的「選擇排序」那篇文章里也提到了一些,感興趣的同學可以后臺回復「選擇排序」獲得文章~至于堆排序的具體實現和應用,以及為什么實際生產中并不愛用它,我們之后再講。

最后再說一點題外話,最近發現了幾篇搬運我的文章到其他平臺的現象。每篇文章都是我精心打造的,都是自己的心肝寶貝,看到別人直接搬運過去也沒有標明作者和來源出處實在是太難受了。。為了最好的閱讀體驗,文中的圖片我都沒有加水印,但這也方便了他人搬運。今天考慮再三,還是不想違背自己的本意,畢竟我的讀者更為重要。

所以如果之后有小伙伴看到了,懇請大家后臺或者微信告訴我一下呀,非常感謝!

本文轉載自微信公眾號「 碼農田小齊」,可以通過以下二維碼關注。轉載本文請聯系 碼農田小齊公眾號。

 

責任編輯:武曉燕 來源: 碼農田小齊
相關推薦

2024-12-23 12:00:00

C++線程join

2022-05-05 13:54:37

SPI機制APISPI

2019-03-14 15:59:44

前端開發編程

2024-01-30 09:58:00

IP屬地在線服務

2024-03-25 08:18:31

2023-02-07 07:32:12

Istio微服務治理

2019-06-18 09:45:19

正向代理反向代理IT

2021-11-05 12:46:47

定位技術藍牙無線技術

2025-08-05 01:15:00

2019-03-19 15:28:30

Linux 系統 數據

2021-01-22 08:37:02

二進制Binary SemaReentrant L

2021-05-09 21:57:08

數據倉庫Olap

2021-08-04 09:00:55

閉包Go調用

2022-04-25 15:23:18

分布式系統故障

2024-10-28 00:00:03

IP屬地地址

2021-02-14 22:33:23

Java字符字段

2021-01-22 08:13:58

Java日期時間API

2011-07-22 16:50:05

JAVA

2025-08-27 09:12:00

谷歌AI模型

2017-08-02 10:43:39

深度學習TensorFlowRNN
點贊
收藏

51CTO技術棧公眾號

国产美女精品视频国产| 欧美大片久久久| 四虎在线观看| 日韩精品91亚洲二区在线观看 | 亚洲深夜福利在线观看| 日本韩国欧美三级| 精品一区二区成人免费视频| 蜜臀av午夜精品| 日韩在线一二三区| 欧美老女人在线视频| 天天插天天射天天干| 电影在线观看一区二区| 亚洲一区影音先锋| 日韩精品无码一区二区三区| 亚洲伦理在线观看| 日本女人一区二区三区| 欧美寡妇偷汉性猛交| 手机看片福利视频| 嗯用力啊快一点好舒服小柔久久| 在线观看成人免费视频| 日韩黄色片在线| 国产女主播在线写真| 成人美女视频在线观看| 国产主播欧美精品| 午夜精品一区二| 国内久久精品| 日韩天堂在线视频| 亚洲av无码国产精品久久| 中文字幕综合| 欧美午夜视频网站| aa视频在线播放| 黄视频网站在线看| 欧美激情在线一区二区三区| 国产一区二区三区高清| 国产成人精品一区二三区四区五区 | 黑森林国产精品av| 亚洲精品国产高清久久伦理二区| 日本不卡一区| 日韩大片b站免费观看直播| 国产一区二区三区精品视频| 国产精品久久久久久久久久久不卡| 国产在线观看免费视频今夜| 性xxxx欧美老肥妇牲乱| 伊人精品在线观看| 中文字幕免费高清| 亲子伦视频一区二区三区| 日韩视频一区在线观看| 久久撸在线视频| 亚洲第一会所001| 欧美午夜精品在线| 青青青免费在线| 免费在线观看的电影网站| 最好看的中文字幕久久| 一区二区不卡视频| 成a人片在线观看www视频| 久久夜色精品国产欧美乱极品| 国产在线一区二区三区四区| 亚洲精品一区二区三区蜜桃| 国产91露脸合集magnet| 成人动漫视频在线观看完整版| 亚洲无码精品国产| 久久精品国产精品亚洲精品| 国产精品伦子伦免费视频| 天天天天天天天干| 蜜臀av一区二区在线免费观看| 国产精品白嫩美女在线观看| 亚洲精品91天天久久人人| 日韩电影在线观看网站| 国产精品情侣自拍| 中文字幕有码视频| 九九在线精品视频| 亚洲一区二区三区sesese| 国产露脸国语对白在线| 国产二区国产一区在线观看| 99理论电影网| 天天干天天操av| 2024国产精品| 亚洲精品成人三区| 黄色在线免费网站| 亚洲国产视频一区| 亚洲中文字幕无码专区| 久久91导航| 5566中文字幕一区二区电影| 国产chinesehd精品露脸| 噜噜噜天天躁狠狠躁夜夜精品| 亚洲精品福利免费在线观看| 免费人成又黄又爽又色| 亚洲国产成人精品女人| 亚洲18私人小影院| 国产成人自拍偷拍| 国产乱淫av一区二区三区 | 国产精品爽爽久久| 国产91精品露脸国语对白| 久久99久久精品国产| 丁香在线视频| 亚洲在线观看免费视频| 99爱视频在线| 四虎地址8848精品| 日韩av有码在线| 2014亚洲天堂| 99综合视频| 91久久精品美女高潮| 日本激情视频网站| 欧美极品美女视频| 欧美黑人在线观看| 国产精品.xx视频.xxtv| 欧美精品一区二区三区四区| 色欲狠狠躁天天躁无码中文字幕 | 激情五月宗合网| 福利视频亚洲| 日韩欧美高清一区| www.黄色在线| 亚洲美女色禁图| 国产精品久久国产精品99gif| 亚洲免费成人网| 国产欧美日韩亚州综合| cao在线观看| **国产精品| 亚洲色图五月天| 亚洲国产精品午夜在线观看| 精品一区二区日韩| 欧美日韩综合久久| av丝袜在线| 日韩一区二区免费在线观看| xxxx日本免费| 亚洲欧洲视频| 亚洲专区在线视频| 午夜视频成人| 91久久一区二区| 粉嫩av懂色av蜜臀av分享| 欧美韩国一区| 91日本视频在线| 性开放的欧美大片| 在线免费不卡视频| 波多野结衣福利| 国产欧美精品| 国产精品一区二区欧美黑人喷潮水| 老司机午夜在线视频| 在线这里只有精品| 在线观看日本中文字幕| 校园春色综合网| 国内精品二区| 国产h片在线观看| 欧美成人猛片aaaaaaa| 九九热最新地址| 国内不卡的二区三区中文字幕| 日韩精品一线二线三线| 精品亚洲美女网站| 亚洲人成在线播放| 亚洲不卡在线视频| 久久在线免费观看| avav在线看| 亚洲女娇小黑人粗硬| 欧美重口另类videos人妖| 熟妇人妻av无码一区二区三区| 亚洲国产欧美日韩另类综合 | 欧美a∨亚洲欧美亚洲| 波多野结衣精品在线| 18黄暴禁片在线观看| 六月丁香久久丫| 欧美洲成人男女午夜视频| 蜜芽tv福利在线视频| 91国偷自产一区二区使用方法| 第一次破处视频| 久久国产尿小便嘘嘘| 自拍偷拍99| 亚洲午夜免费| 高清亚洲成在人网站天堂| 搡老岳熟女国产熟妇| 日韩欧美在线视频观看| 国产三级黄色片| 久久99精品国产| 法国空姐在线观看免费| 中文字幕日韩高清在线| 91精品国产成人| 美女毛片在线看| 欧美精品久久99久久在免费线| 老熟妇高潮一区二区三区| 国产精品香蕉一区二区三区| 国产日本在线播放| 国产精品免费大片| 国产在线精品播放| 国产啊啊啊视频在线观看| 亚洲女人初尝黑人巨大| 亚洲天堂aaa| 亚洲线精品一区二区三区八戒| 精品夜夜澡人妻无码av| 麻豆一区二区在线| 欧美成人精品免费| 青青草国产成人a∨下载安卓| 亚洲影影院av| 一区二区三区短视频| 久久在线观看视频| 天堂a√在线| 69精品人人人人| 亚洲一区欧美在线| 国产精品第一页第二页第三页| 男人的天堂免费| 日日夜夜精品视频天天综合网| 警花观音坐莲激情销魂小说| 群体交乱之放荡娇妻一区二区 | 亚洲天天综合网| 午夜精品福利视频网站| www中文在线| av网站一区二区三区| 亚洲欧美日韩精品一区| 在线亚洲成人| 永久免费在线看片视频| 久久93精品国产91久久综合| 亚洲aa在线观看| 欧美中文字幕精在线不卡| 欧美wwwxxxx| 国产美女视频一区二区三区| 亚洲精品一区二区三区福利| 国产露脸国语对白在线| 欧美中文字幕亚洲一区二区va在线 | 国产精品欧美一区喷水| 97香蕉碰碰人妻国产欧美| 国产一区二区三区av电影| 91看片就是不一样| 亚洲美女一区| 菠萝蜜视频在线观看入口| 欧洲视频一区| 免费在线观看91| 激情av综合| 99久久无色码| 榴莲视频成人app| 国产日韩精品在线播放| 无人区在线高清完整免费版 一区二| 色综合男人天堂| 制服丝袜在线播放| 久久精品亚洲94久久精品| 高清中文字幕一区二区三区| 国产视频亚洲视频| 人妻一区二区三区四区| 日韩精品中文字幕在线一区| 一级α片免费看刺激高潮视频| 色拍拍在线精品视频8848| 日本黄色片视频| 亚洲成人一区在线| 国产精品theporn动漫| 伊人性伊人情综合网| 好吊日在线视频| 亚洲欧美综合色| 777777国产7777777| 国产精品高潮呻吟久久| 婷婷丁香综合网| 国产精品成人免费| 可以免费看av的网址| 中文欧美字幕免费| 成人18视频免费69| 最新国产の精品合集bt伙计| 91麻豆精品成人一区二区| 亚洲啪啪综合av一区二区三区| 国产麻豆a毛片| 亚洲女与黑人做爰| 九九久久免费视频| 性做久久久久久久久| 一区二区三区视频免费看| 姬川优奈aav一区二区| 免费观看成人毛片| 色婷婷av一区| 中文字幕一二三四| 欧美日韩国产在线播放网站| 91福利在线观看视频| 欧美一级在线免费| 亚洲精选一区二区三区| 亚洲国产欧美一区二区丝袜黑人| 婷婷综合激情网| 国产一区二区三区视频在线观看| av在线二区| 久久久成人精品| 欧美videossex| 日韩免费黄色av| 亚洲欧美久久精品| av资源站久久亚洲| 婷婷成人在线| 亚洲一二三区在线| 综合日韩在线| 欧美国产激情视频| 久久综合综合久久综合| 国产免费无码一区二区| 91亚洲国产成人精品一区二区三| 欧美激情久久久久久久| 亚洲精品videosex极品| 五月婷婷激情网| 欧美精品1区2区| 免费av网站观看| 尤物yw午夜国产精品视频| 日本一本在线免费福利| 青青草成人在线| 欧美一区一区| 久久这里精品国产99丫e6| 国产精品99视频| 久久久999视频| 狠狠色2019综合网| 国产麻豆xxxvideo实拍| **欧美大码日韩| 婷婷激情五月网| 日韩一二三四区| 久草在现在线| 欧美激情喷水视频| 国产成人精品一区二三区在线观看 | 天天爱天天做天天操| 国产午夜久久| 黄色片子免费看| 国产日韩欧美精品电影三级在线| 青青草手机在线观看| 欧美体内she精视频| 日本高清视频免费观看| 久久精品人人做人人爽| 澳门成人av网| 国产精品美女久久久久av福利| 成人综合专区| 国产免费毛卡片| 国产精品综合在线视频| 国产伦精品一区二区三区视频女| 午夜精品久久久久久久99樱桃| 一起草av在线| 亚洲日韩第一页| 超碰高清在线| 不卡视频一区| 先锋资源久久| 九色91popny| 久久免费看少妇高潮| 精品亚洲永久免费| 91精品国产一区二区三区| 91视频在线观看| 日本aⅴ大伊香蕉精品视频| 国产福利一区二区精品秒拍| 国产一二三四区在线观看| 理论电影国产精品| 少妇精品无码一区二区免费视频| 日韩欧美在线视频| 你懂的在线视频| 欧美夜福利tv在线| 国产毛片久久久| av高清在线免费观看| 国产999精品久久| 欧美丰满艳妇bbwbbw| 欧美一区二区三区思思人| www.欧美日本韩国| 91在线视频成人| 亚洲最大av| 亚洲一级片免费观看| 亚洲男人的天堂在线观看| 国产日韩欧美视频在线观看| 久久久电影免费观看完整版| 精品国产亚洲日本| 好吊色视频988gao在线观看| 国产精品一区在线观看你懂的| 玖玖爱这里只有精品| 日韩一区二区三区精品视频| 在线免费观看污| 成人做爰66片免费看网站| 国内精品久久久久久久影视麻豆 | 人妻中文字幕一区二区三区| 一本色道久久88亚洲综合88| 成人免费一区| 一区二区三区四区五区视频| 精品一区二区在线看| 可以直接看的黄色网址| 精品国产青草久久久久福利| av福利在线导航| 久热这里只精品99re8久| 日韩黄色片在线观看| 亚洲一区二区自偷自拍| 9191成人精品久久| 国产探花在线观看| 久久av一区二区| 日韩精品国产欧美| 亚洲精品自拍视频在线观看| 91精品国产综合久久精品性色| 日韩少妇视频| 欧美一区二区影视| 久久精品国产精品亚洲综合| 黄色一级片在线| 亚洲男人天天操| 亚洲欧美专区| 久久久久久www| 国产免费成人在线视频| 99热这里只有精| 国产91成人video| 成人免费看片39| 国产精久久久久| 色菇凉天天综合网| www在线免费观看视频| 精品欧美一区二区在线观看视频 | 亚洲综合在线免费观看| 手机亚洲第一页| 成人午夜高潮视频| 国产一区二区三区久久久久久久久| 美国美女黄色片| 精品999在线播放| 欧美xxxx网站| 欧美日韩性生活片| 亚洲欧洲另类国产综合| 天堂中文在线资源| 国产日韩中文字幕在线| 亚洲精品婷婷|