chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

454398 ? 來源:chinaunix ? 作者:是小齊呀 ? 2020-10-16 11:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

堆其實(shí)就是一種特殊的隊(duì)列——優(yōu)先隊(duì)列。

普通的隊(duì)列游戲規(guī)則很簡(jiǎn)單:就是先進(jìn)先出;但這種優(yōu)先隊(duì)列搞特殊,不是按照進(jìn)隊(duì)列的時(shí)間順序,而是按照每個(gè)元素的優(yōu)先級(jí)來比拼,優(yōu)先級(jí)高的在堆頂。

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

還有其實(shí)每個(gè)人回復(fù)微信消息也是默默的把消息放進(jìn)堆里排個(gè)序:先回男朋友女朋友的,然后再回其他人的。

這里要區(qū)別于操作系統(tǒng)里的那個(gè)“堆”,這兩個(gè)雖然都叫堆,但是沒有半毛錢關(guān)系,都是借用了Heap這個(gè)英文單詞而已。

我們?cè)賮砘仡櫼幌隆付选乖谡麄€(gè)Java集合框架中的位置:

也就是說,

PriorityQueue是一個(gè)類(class);

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

那heap在哪呢?

heap其實(shí)是一個(gè)抽象的數(shù)據(jù)結(jié)構(gòu),或者說是邏輯上的數(shù)據(jù)結(jié)構(gòu),并不是一個(gè)物理上真實(shí)存在的數(shù)據(jù)結(jié)構(gòu)。

heap其實(shí)有很多種實(shí)現(xiàn)方式,比如binomialheap,Fibonacciheap等等。但是面試最??嫉?,也是最經(jīng)典的,就是binaryheap二叉堆,也就是用一棵完全二叉樹來實(shí)現(xiàn)的。

那完全二叉樹是怎么實(shí)現(xiàn)的?

其實(shí)是用數(shù)組來實(shí)現(xiàn)的!

所以binaryheap/PriorityQueue實(shí)際上是用數(shù)組來實(shí)現(xiàn)的。

這個(gè)數(shù)組的排列方式有點(diǎn)特別,因?yàn)樗倳?huì)維護(hù)你定義的(或者默認(rèn)的)優(yōu)先級(jí)最高的元素在數(shù)組的首位,所以不是隨便一個(gè)數(shù)組都叫「堆」,實(shí)際上,它在你心里,應(yīng)該是一棵「完全二叉樹」。

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

那為什么完全二叉樹可以用數(shù)組來實(shí)現(xiàn)?是不是所有的樹都能用數(shù)組來實(shí)現(xiàn)?

這個(gè)就涉及完全二叉樹的性質(zhì)了,我們下一篇會(huì)細(xì)講,簡(jiǎn)單來說,因?yàn)橥耆鏄涞亩x要求了它在層序遍歷的時(shí)候沒有氣泡,也就是連續(xù)存儲(chǔ)的,所以可以用數(shù)組來存放;第二個(gè)問題當(dāng)然是否。

堆的特點(diǎn)

堆是一棵完全二叉樹;

堆序性(heaporder):任意節(jié)點(diǎn)都優(yōu)于它的所有孩子。

a.如果是任意節(jié)點(diǎn)都大于它的所有孩子,這樣的堆叫大頂堆,MaxHeap;

b.如果是任意節(jié)點(diǎn)都小于它的所有孩子,這樣的堆叫小頂堆,MinHeap;

左圖是小頂堆,可以看出對(duì)于每個(gè)節(jié)點(diǎn)來說,都是小于它的所有孩子的,注意是**所有孩子,包括孫子,曾孫...**

既然堆是用數(shù)組來實(shí)現(xiàn)的,那么我們可以找到每個(gè)節(jié)點(diǎn)和它的父母/孩子之間的關(guān)系,從而可以直接訪問到它們。

比如對(duì)于節(jié)點(diǎn)3來說,

它的Index=1,

它的parentindex=0,

左孩子leftchildindex=3,

右孩子rightchildindex=4.

可以歸納出如下規(guī)律:

設(shè)當(dāng)前節(jié)點(diǎn)的index=x,

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

左孩子leftchildindex=2*x+1,

右孩子rightchildindex=2*x+2.

有些書上可能寫法稍有不同,是因?yàn)樗鼈兊臄?shù)組是從1開始的,而我這里數(shù)組的下標(biāo)是從0開始的,都是可以的。

這樣就可以從任意一個(gè)點(diǎn),一步找到它的孫子、曾孫子,真的太方便了,在之后講具體操作時(shí)大家可以更深刻的體會(huì)到。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2997

    瀏覽量

    115612
  • 堆棧
    +關(guān)注

    關(guān)注

    0

    文章

    183

    瀏覽量

    20416
  • 隊(duì)列
    +關(guān)注

    關(guān)注

    1

    文章

    46

    瀏覽量

    11191
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    java集合干貨系列

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

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

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

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

    主要作用是整流,調(diào)整電流方向。用橋整流是比較好的,首先是很方便,而且它內(nèi)部的四個(gè)管子一般是挑選配對(duì)的,所以其性能較接近,還有就是大功率的整流時(shí),橋堆上都可以裝散熱塊,使工作時(shí)性能更穩(wěn)定,當(dāng)然使用場(chǎng)
    發(fā)表于 01-25 10:24

    整流,什么是整流

    整流,什么是整流的檢測(cè) 1. 全橋的檢測(cè) 大多數(shù)的整流全橋上,均標(biāo)注有“+”、“-”、“~”符號(hào)(其中“+”為整流后輸出電壓
    發(fā)表于 02-27 10:46 ?2411次閱讀

    常用橋及半橋電路結(jié)構(gòu)分析

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

    明確區(qū)分與棧,和棧究竟有什么區(qū)別?

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

    什么是內(nèi)存?內(nèi)存是如何分配的?

    一般的編譯系統(tǒng)內(nèi)存的分配方向和棧內(nèi)存是相反的。當(dāng)棧內(nèi)存從高地址向低地址增長的時(shí)候,內(nèi)存從低地址向高地址分配。
    的頭像 發(fā)表于 07-05 17:58 ?1.1w次閱讀

    整流橋作用和原理圖

    整流橋作用和原理圖? 整流橋是一種電路,可以將交流電信號(hào)轉(zhuǎn)換為直流電信號(hào)。許多電子設(shè)備,電子元件需要直流電源來供電,而通常的電源是
    的頭像 發(fā)表于 08-24 15:17 ?1.1w次閱讀

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

    電源,電視機(jī)電源等。本文將詳細(xì)解讀橋作用及工作原理。 一、橋作用 1.將交流電轉(zhuǎn)換成直流電 橋的主要
    的頭像 發(fā)表于 08-24 15:17 ?1.2w次閱讀

    整流橋作用是什么?發(fā)電機(jī)整流橋的作用是什么?

    整流橋作用是什么?發(fā)電機(jī)整流橋的作用是什么? 整流橋作用電路
    的頭像 發(fā)表于 08-24 15:18 ?4567次閱讀

    Java的對(duì)象一定在中分配嗎

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

    的實(shí)現(xiàn)思路

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

    jvm配置內(nèi)存初始值參數(shù)

    JVM(Java Virtual Machine)是Java語言的運(yùn)行環(huán)境,它通過解釋字節(jié)碼并執(zhí)行相應(yīng)的指令來運(yùn)行Java程序。JVM,
    的頭像 發(fā)表于 12-05 14:17 ?1291次閱讀

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

    功率放大器壓電疊作用是為壓電疊提供足夠的電能,使其產(chǎn)生強(qiáng)大的機(jī)械振動(dòng)。以下為您詳細(xì)介紹一下。 壓電疊
    的頭像 發(fā)表于 01-09 16:14 ?812次閱讀
    ATA-P系列功率放大器<b class='flag-5'>在</b>壓電疊<b class='flag-5'>堆</b><b class='flag-5'>中</b>的<b class='flag-5'>作用</b>是什么

    如何使用SystemView的監(jiān)控功能

    SystemView能夠監(jiān)視應(yīng)用程序如何使用動(dòng)態(tài)存儲(chǔ)。這意味著,如果應(yīng)用程序中使用了C或C++、自定義或RTOS提供的內(nèi)存池對(duì)象,我們可以跟蹤這些對(duì)象的使用情況。SystemView可以一個(gè)
    的頭像 發(fā)表于 08-09 18:07 ?1738次閱讀
    如何使用SystemView的<b class='flag-5'>堆</b>監(jiān)控功能