優先隊列默認是小頂堆嗎_一分鐘帶你讀懂什么是堆?

堆其實就是一種特殊的隊列——優先隊列。
普通的隊列游戲規則很簡單:就是先進先出;但這種優先隊列搞特殊,不是按照進隊列的時間順序,而是按照每個元素的優先級來比拼,優先級高的在堆頂
這也很容易理解吧,比如各種軟件都有會員制度,某軟件用了會員就能加速下載的,不同等級的會員速度還不一樣,那就是優先級不同呀。
還有其實每個人回復微信消息也是默默的把消息放進堆里排個序:先回男朋友女朋友的,然后再回其他人的。
這里要區別于操作系統里的那個“堆”,這兩個雖然都叫堆,但是沒有半毛錢關系,都是借用了 Heap 這個英文單詞而已。
我們再來回顧一下「」在整個 Java 集合框架中的位置:

3d2b68faff888f815252a6181a4f6a69.png

也就是說,

  • 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;

960cf900a4963395960276c5807cb782.png

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

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

c2e6f57258e5a64add0b23f6532c7ffe.png

比如對于節點 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 開始的,都是可以的。
這樣就可以從任意一個點,一步找到它的孫子、曾孫子,真的太方便了,在之后講具體操作時大家可以更深刻的體會到。
那有關堆的基本操作,以及為什么 heapify() 是 O(n) 的,我們之后再聊。


作者:是小齊呀
鏈接:https://juejin.im/post/6880291677651599367

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533812.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533812.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533812.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

螺旋測微器b類不確定度_物理實驗直測量不確定度評估.ppt

物理實驗直測量不確定度評估直接測量不確定度評估 Gauss分布 測量列的平均值、標準差 A類不確定度 t分布 B類不確定度 直接測量的合成不確定度 Gauss分布 也稱正態分布。 δ的平均值等于0、方差為σ。 特征: 對稱性——大于平均值與小于平均值的概率相等&#xff1b…

python 執行shell_python執行shell命令的方法

python執行shell命令的方法 os模塊 os.system方式: import os os.system(top) os.system(cat /proc/cpuinfo) 說明 這個調用相當直接,且是同步進行的,程序需要阻塞并等待返回。 返回值是依賴于系統的,直接返回系統的調用返回值&am…

linux下c語言讀取roed文件,如何在Linux系統上安裝Android4.4.docx

Android (x86)項目致力于移植 Android系統到X86處理器上,使用戶可以更容易的在任何電腦上安裝Android。他們通過使用android源碼,增加補丁來使 Android能夠在X86處理器,筆記本電腦和平板 電腦下工作。前一段時間,項目組發布了最新…

微信小程序setinterval_簡單談談setTimeout與setInterval

感謝踩過的坑sf社區的第一篇文章。最近在做一個拍賣的微信小程序,用到了定時器setTimout和setInterval,簡單談談這兩個api。setTimeout最常見的用法就是第二種(第三種mdn文檔不推薦),如:var timeoutId setTimeout(function() {console.log(hello world!…

python 注釋一段話_Python快速入門(一)

引言Python作為一個,目前最火的編程語言之一,已經滲透到了各行各業。它易學好懂,擁有著豐富的庫,功能齊全。人生苦短,就用Python。這個快速入門系列分為六篇,包含了Python大部分基礎知識,每篇閱…

linux ibus獲取窗體位置,Ubuntu 12.04 顯示ibus 的輸入框

在虛擬機中安裝了Ubuntu 12.04,系統是英文版本的,我能接受,但是苦于沒有中文輸入法。起先,我是安裝SCIM,結果我折騰了半天,發現其只能在lib-office下使用。firefox,文字編輯器中都不能調出SCIM。無奈將其卸…

transporter上傳卡正在交付_【iOS】Xcode11使用Transporter將APP上傳到App Store,卡在正在驗證APP...

問題:在使用Transporter時,會卡主,一直顯示正在驗證APP在這里插入圖片描述解決方案一:利用V-P-N在這里插入圖片描述使用安全上網(V-P-N),雙擊打開iTMSTransporter,等待幾分鐘lichuangMacBook-Pro-3 ~ % /Ap…

python練手經典100例微盤_20個Python練手經典案例,能全做對的人確實很少!

100個Python練手小程序,學習python的很好的資料,覆蓋了python中的每一部分,可以邊學習邊練習,更容易掌握python。 如果你感覺學不會?莫慌,小編推薦大家加入群, 前面548中間377后面875&#xff0…

小紅帽linux各功能中英,英文短劇《小紅帽》劇本臺詞完整版---中英對照文本版...

大灰狼和小紅帽的故事紅帽第一場:小紅帽家 媽媽: (媽媽拿著一個籃子,把桌子上的水果放在籃子里) 小紅帽唱著歌,歡快地跑進來)Hi,mummy, what are you doing? 嘿,媽媽 你在什么? 媽媽: (一邊把水…

uipath循環datatable_UiPath之DataTable轉換為List和Array

今天給大家分享一下,如何將DataTable轉為List和Array,為此小U也花了不少時間研究,最后發現沒有那么復雜。先來說說List和Array的區別:List:就像一個鏈條,存儲數據的空間可以不連續。Array:就像一…

python批量下載文件教程_Python抓包菜鳥教程:批量下載圖片的方法,電腦和手機都能用...

筆者看上了一組圖集,然后準備一張一張下載時,瞄了一眼,這組圖集還有100,好吧,我酸了。 筆者就是試試工具,你們別像我這樣用,這么好的工具,做自媒體,那絕對了那如何批量下…

esxi掛載Linux的nfs盤,ESXi安裝centos7掛載群暉NFS

前段時間折騰了ESXi,然后無盡的折騰接踵而來,今天要說的是如何安裝centos7并掛載群暉虛擬機的NFS共享文件夾直接步入正題!先是下載centos7鏡像,因為我是用來當服務器的,所以只需要minimal版即可【centos下載鏈接】自己…

python使用的編輯器_我用過的最好的python編輯器PyScripter

用了IDLE, PythonWin等幾個python編輯器,在代碼補全、參數提示等功能上都非常不滿意。 終于找到PyScripter并且試用了一下,代碼補全、參數提示等功能非常強大。這個功能其實非常重要,可以大大提高開發效率,減少出錯。很滿意.PyScr…

linux is not unix由來,一些奇怪的 unix 指令名字的由來(轉)

一些奇怪的 unix 指令名字的由來(轉)[more]一些奇怪的 unix 指令名字的由來awk "Aho Weinberger and Kernighan"這個語言以作者 Al Aho, Peter Weinberger 和 Brian Kernighan 的姓來命名。grep "Global Regular Expression Print"grep 來自 ed 的列印所…

python discuz_pythonDiscuz發帖器的實現

網絡技術需要大家共同分享,不能閉門造車,下面是bj-dnsCom提示:首先要清楚discuz論壇發帖的流程,簡單地說就是以下流程:進入登錄頁 ->登錄 -> 進入版面 ->發帖 首先要清楚discuz論壇發帖的流程,簡單地說就是以…

基于linux的業設計課題,基于linux下智能手機的設計與制作 畢業設計.doc

本科生畢業論文(設計)題 目: 基于linux下智能手機的設計與制作目錄1. 緒論11.1 嵌入式系統的應用前景11.2linux操作系統21.2.1Linux介紹22.硬件、軟件介紹32.1S3c2440知識32.1.1S3c2440系統結構介紹32.1.2arm實驗儀介紹72.2 GPRS無線模組92.2.1 GPRS概述及工作原理9…

excel文件導入hive亂碼_將excel中的數據導入hive

步驟一:將excel另存為txt文檔(文本文件(制表符分割))假設名字為CompanyCode.txt步驟二,將該txt文件導入Linux指定目錄中步驟三,轉換編碼格式,在指定目錄下執行如下命令:piconv -f gb2312 -t UTF-8 CompanyCode.txt &g…

傳統的6d位姿估計fangfa1_李飛飛團隊最新論文:基于anchor關鍵點的類別級物體6D位姿跟蹤...

點擊上方“3D視覺工坊”,選擇“星標”干貨第一時間送達簡介作者提出了一種基于RGB-D的深度學習方法6PACK,能夠實時的跟蹤已知類別物體。通過學習用少量的3D關鍵點來簡潔地表示一個物體,基于這些關鍵點,通過關鍵點匹配來估計物體在…

c語言的程序結構語序,第3章 C語序結構.doc

第3章 C語序結構第三章 基本語句本章要求:1.表達式語句,空語句,復合語句2.數據的輸入與輸出,輸入,輸出函數的調用C語句概述C程序的執行部分是由語句組成的。 程序的功能也是由執行語句實現的。3.1 賦值語句賦值語句: 是由賦值表達式再加上分號構成的表達…

安卓system鏡像分區_玩機愛好者想要的PT分區到底是什么?可以使現有的安卓系統更快!...

小編第一次看見PT分區這個詞。就比較好奇他到底是什么神仙技術。今天,小編給大家科普一下,可能小編理解的也不是特別準確,請各位諒解!! 歡迎關注小編。各位玩機愛好者總是沉浸在各種ROM包、第三發Rec,以及各…