Java優(yōu)先隊(duì)列?priority?queue
1.優(yōu)先隊(duì)列概念
優(yōu)先隊(duì)列(priority queue
)是一種特殊的數(shù)據(jù)結(jié)構(gòu)。
隊(duì)列中每一個(gè)元素都被分配到一個(gè)優(yōu)先權(quán)值,出隊(duì)順序按照優(yōu)先權(quán)值來(lái)劃分。
一般有兩種出隊(duì)順序:高優(yōu)先權(quán)出隊(duì)或低優(yōu)先權(quán)出隊(duì)。priority queue
至少要有兩個(gè)最基本的ADT:進(jìn)隊(duì),出隊(duì)(按照高優(yōu)先權(quán)或低優(yōu)先權(quán))
產(chǎn)生原因:同樣是為了提高數(shù)據(jù)處理的效率。試想,要實(shí)現(xiàn)優(yōu)先隊(duì)列對(duì)應(yīng)的功能,若使用鏈表或者數(shù)組,那么要么先排序再插入,要么先插入再查找最大最小元素。這樣一來(lái),入隊(duì)出隊(duì)的時(shí)間復(fù)雜度至少為O(N)。
- 優(yōu)先隊(duì)列出隊(duì)和入隊(duì)的時(shí)間復(fù)雜度均為O(log N)。
- 優(yōu)先隊(duì)列基于二叉堆實(shí)現(xiàn)。
2.二叉堆(Heap)
堆是一種特殊的二叉樹(shù),性質(zhì)如下:
- 每個(gè)結(jié)點(diǎn)的值都大于或等于其左右孩子結(jié)點(diǎn)的值(大頂堆),或每個(gè)結(jié)點(diǎn)的值都小宇或等于其左右孩子的值(小頂堆)。
- 必須滿(mǎn)足完全二叉樹(shù)的結(jié)構(gòu)。
完全二叉樹(shù)和滿(mǎn)二叉樹(shù)
完全二叉樹(shù) complete binary tree
葉節(jié)點(diǎn)只可能出現(xiàn)在最后兩層,且最后一層的葉節(jié)點(diǎn)都左對(duì)齊
一棵深度為h的完全二叉樹(shù)
滿(mǎn)二叉樹(shù) full binary tree
深度為h的滿(mǎn)二叉樹(shù)有(2^h)-1個(gè)結(jié)點(diǎn)
由二叉堆的定義可以看出,跟結(jié)點(diǎn)一定是二叉堆中結(jié)點(diǎn)值最大(或最?。┑?。較大(或較小)的結(jié)點(diǎn)靠近根節(jié)點(diǎn)
堆的存儲(chǔ)結(jié)構(gòu):
一般情況下,堆用數(shù)組來(lái)存儲(chǔ),第i個(gè)結(jié)點(diǎn)的父節(jié)點(diǎn)的下標(biāo)就是(i-1)/2.
如果用層序遍歷順序?qū)⒋箜敹押托№敹汛嫒霐?shù)組,
則關(guān)系如圖:
堆的重要操作
插入:插入一個(gè)元素之后,新元素首先被插入表層(即最后一層盡可能左邊的位置),之后再根據(jù)堆的性質(zhì)進(jìn)行調(diào)整。
例:寫(xiě)出一次一個(gè)地將10,12,1,14,6,5,8,15,3,9,7,4,11,13和2插入一個(gè)初始為空的二叉堆的結(jié)果
刪除:刪除總是發(fā)生在根處,之后將最后一個(gè)元素(即最后一層最右邊的元素)拿來(lái)填補(bǔ)空缺,之后根據(jù)堆的性質(zhì)進(jìn)行調(diào)整堆的結(jié)構(gòu)。
到此這篇關(guān)于Java優(yōu)先隊(duì)列 priority queue
的文章就介紹到這了,更多相關(guān)優(yōu)先隊(duì)列 priority queue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊(duì)列)的實(shí)現(xiàn)
- java數(shù)據(jù)結(jié)構(gòu)-堆實(shí)現(xiàn)優(yōu)先隊(duì)列
- Java優(yōu)先隊(duì)列(PriorityQueue)重寫(xiě)compare操作
- java優(yōu)先隊(duì)列PriorityQueue中Comparator的用法詳解
- Java的優(yōu)先隊(duì)列PriorityQueue原理及實(shí)例分析
- Java基于堆結(jié)構(gòu)實(shí)現(xiàn)優(yōu)先隊(duì)列功能示例
- java編程實(shí)現(xiàn)優(yōu)先隊(duì)列的二叉堆代碼分享
- Java數(shù)據(jù)結(jié)構(gòu)優(yōu)先隊(duì)列實(shí)練
相關(guān)文章
java實(shí)現(xiàn)簡(jiǎn)單解析XML文件功能示例
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單解析XML文件功能,結(jié)合實(shí)例形式分析了java針對(duì)xml文件的讀取、遍歷節(jié)點(diǎn)及輸出等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式
這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式,對(duì)設(shè)計(jì)模式感興趣的同學(xué),一定要看一下2021-04-04java實(shí)現(xiàn)搶紅包算法(公平版和手速版)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)搶紅包算法,分為公平版和手速版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09Java實(shí)現(xiàn)SM3加密和驗(yàn)證的示例代碼
在商用密碼體系中,SM3主要用于數(shù)字簽名及驗(yàn)證、消息認(rèn)證碼生成及驗(yàn)證、隨機(jī)數(shù)生成等,其算法公開(kāi),本文給大家詳細(xì)介紹了使用Java實(shí)現(xiàn)SM3加密和驗(yàn)證,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-12-12JavaWeb響應(yīng)下載功能實(shí)例代碼(包含工具類(lèi))
今天通過(guò)本文給大家分享的是關(guān)于javaweb的響應(yīng)(response)下載功能,需要的朋友參考下吧2017-07-07