色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是堆,堆在整個Java集合框架中的作用

454398 ? 來源:chinaunix ? 作者:是小齊呀 ? 2020-10-16 11:26 ? 次閱讀

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

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

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

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

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

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

也就是說,

PriorityQueue是一個類(class);

PriorityQueue繼承自Queue這個接口(Interface);

那heap在哪呢?

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

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

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

其實是用數組來實現的!

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

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

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

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

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

堆的特點

堆是一棵完全二叉樹;

堆序性(heaporder):任意節點都優于它的所有孩子

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

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

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

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

比如對于節點3來說,

它的Index=1,

它的parentindex=0,

左孩子leftchildindex=3,

右孩子rightchildindex=4.

可以歸納出如下規律:

設當前節點的index=x,

那么parentindex=(x-1)/2,

左孩子leftchildindex=2*x+1,

右孩子rightchildindex=2*x+2.

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

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

那有關堆的基本操作,以及為什么heapify()是O(n)的,我們之后再聊。
編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2970

    瀏覽量

    104809
  • 堆棧
    +關注

    關注

    0

    文章

    182

    瀏覽量

    19779
  • 隊列
    +關注

    關注

    1

    文章

    46

    瀏覽量

    10911
收藏 人收藏

    評論

    相關推薦

    java集合干貨系列

      Comparable和Comparator都是Java集合框架的成員  Iterator接口  集合輸出的標注你操作  標準做法,使用Iterator接口  操作原理:  Iter
    發表于 12-14 15:11

    壓水是什么意思?壓水堆有什么作用

    壓水是什么意思?壓水堆有什么作用?壓水y有哪些功能?
    發表于 07-01 08:43

    什么是橋,橋作用是什么?

    主要作用是整流,調整電流方向。用橋整流是比較好的,首先是很方便,而且它內部的四個管子一般是挑選配對的,所以其性能較接近,還有就是大功率的整流時,橋堆上都可以裝散熱塊,使工作時性能更穩定,當然使用場
    發表于 01-25 10:24

    整流,什么是整流

    整流,什么是整流的檢測 1. 全橋的檢測 大多數的整流全橋上,均標注有“+”、“-”、“~”符號(其中“+”為整流后輸出電壓
    發表于 02-27 10:46 ?2149次閱讀

    常用橋及半橋電路結構分析

    及半橋都是整流二極管的組合器件,這一點可以從它們的結構中看出。許多電源電路中使用橋或半橋構成整流電路。
    發表于 08-26 10:34 ?8756次閱讀
    常用橋<b class='flag-5'>堆</b>及半橋<b class='flag-5'>堆</b>電路結構分析

    明確區分與棧,和棧究竟有什么區別?

    這條短短的一句話就包含了與棧,看到new,我們首先就應該想到,我們分配了一塊內存,那么指針p呢?他分配的是一塊棧內存,所以這句話的意思就是:棧內存存放了一個指向一塊
    的頭像 發表于 04-09 09:45 ?4431次閱讀
    明確區分<b class='flag-5'>堆</b>與棧,<b class='flag-5'>堆</b>和棧究竟有什么區別?

    什么是內存?內存是如何分配的?

    一般的編譯系統內存的分配方向和棧內存是相反的。當棧內存從高地址向低地址增長的時候,內存從低地址向高地址分配。
    的頭像 發表于 07-05 17:58 ?1w次閱讀

    整流橋作用和原理圖

    整流橋作用和原理圖? 整流橋是一種電路,可以將交流電信號轉換為直流電信號。許多電子設備,電子元件需要直流電源來供電,而通常的電源是
    的頭像 發表于 08-24 15:17 ?7599次閱讀

    作用是什么?橋整流后電壓是多少?

    電源,電視機電源等。本文將詳細解讀橋作用及工作原理。 一、橋作用 1.將交流電轉換成直流電 橋的主要
    的頭像 發表于 08-24 15:17 ?8172次閱讀

    整流橋作用是什么?發電機整流橋的作用是什么?

    整流橋作用是什么?發電機整流橋的作用是什么? 整流橋作用電路
    的頭像 發表于 08-24 15:18 ?3010次閱讀

    Java的對象一定在中分配嗎

    我們的日常編程實踐,我們經常會遇到各種類型的對象,比如字符串、列表、自定義類等等。這些對象在內存是如何存儲的呢? 你可能會毫不猶豫地回答:“
    的頭像 發表于 09-30 10:19 ?992次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>的對象一定在<b class='flag-5'>堆</b>中分配嗎

    的實現思路

    要么等于或者大于(小于)子節點的值。 1.1 的分類 一般分為兩類: 大堆和小堆 。 大堆,父節點的值大于或等于子節點的值, 小堆,父節點的值小于或等于子節點的值。
    的頭像 發表于 11-24 16:02 ?431次閱讀
    <b class='flag-5'>堆</b>的實現思路

    jvm配置內存初始值參數

    JVM(Java Virtual Machine)是Java語言的運行環境,它通過解釋字節碼并執行相應的指令來運行Java程序。JVM
    的頭像 發表于 12-05 14:17 ?781次閱讀

    ATA-P系列功率放大器壓電疊作用是什么

    功率放大器壓電疊作用是為壓電疊提供足夠的電能,使其產生強大的機械振動。以下為您詳細介紹一下。 壓電疊
    的頭像 發表于 01-09 16:14 ?389次閱讀
    ATA-P系列功率放大器<b class='flag-5'>在</b>壓電疊<b class='flag-5'>堆</b><b class='flag-5'>中</b>的<b class='flag-5'>作用</b>是什么

    如何使用SystemView的監控功能

    SystemView能夠監視應用程序如何使用動態存儲。這意味著,如果應用程序中使用了C或C++、自定義或RTOS提供的內存池對象,我們可以跟蹤這些對象的使用情況。SystemView可以一個
    的頭像 發表于 08-09 18:07 ?823次閱讀
    如何使用SystemView的<b class='flag-5'>堆</b>監控功能
    主站蜘蛛池模板: 国产3级在线观看| md2.pud 麻豆传媒官网| 制服丝袜第一页| 日本老人oldmantv乱| 在线观看亚洲AV无码每日更新| 国产午夜一区二区三区免费视频| 亲胸吻胸添奶头GIF动态图免费| 97久久伊人精品影院| 久久精品亚洲视频| 亚洲欧美免费无码专区| 国产色婷婷精品人妻蜜桃成熟| 天天综合亚洲综合网站| 一起洗澡的老师免费播放| 99久久e免费热视频百度| 久久精品无码一区二区日韩av | 日本熟妇乱妇熟色A片蜜桃| 97精品一区二区视频在线观看| 老外的好大c的我好爽| 18禁在线无遮挡羞羞漫画| 恋夜影院安卓免费列表uc| 综合人妻久久一区二区精品| 免费人成网站永久| 99在线播放| 日韩亚洲人成在线| 国产精品久久毛片A片软件爽爽| 新香蕉少妇视频网站| 国产揄拍国产精品| 嗯啊快停下我是你老师啊H| 91久久偷偷做嫩草影院免费看| 嫩草影院久久精品| 成3d漫二区三区四区| 免费观看久久| chinese野外男女free| 欧美一区二区三区男同| 囯产精品久久久久久久久免费蜜桃 | 果冻传媒在线观看网站| 欧洲美女人 一级毛片| 攻把受做哭边走边肉楼梯PLAY | 入禽太深免费视频10| 国产精品亚洲一区二区三区久久 | 国语对白老女人8av|