Java優先隊列 priority queue

1.優先隊列概念

優先隊列(priority queue)是一種特殊的數據結構。
隊列中每一個元素都被分配到一個優先權值,出隊順序按照優先權值來劃分
一般有兩種出隊順序:高優先權出隊低優先權出隊
priority queue至少要有兩個最基本的ADT:進隊出隊(按照高優先權或低優先權)

產生原因:同樣是為瞭提高數據處理的效率。試想,要實現優先隊列對應的功能,若使用鏈表或者數組,那麼要麼先排序再插入,要麼先插入再查找最大最小元素。這樣一來,入隊出隊的時間復雜度至少為O(N)。

  • 優先隊列出隊和入隊的時間復雜度均為O(log N)。
  • 優先隊列基於二叉堆實現。

2.二叉堆(Heap)

堆是一種特殊的二叉樹,性質如下:

  • 每個結點的值都大於或等於其左右孩子結點的值(大頂堆),或每個結點的值都小宇或等於其左右孩子的值(小頂堆)。
  • 必須滿足完全二叉樹的結構。

完全二叉樹和滿二叉樹

完全二叉樹 complete binary tree

葉節點隻可能出現在最後兩層,且最後一層的葉節點都左對齊
一棵深度為h的完全二叉樹

請添加圖片描述

滿二叉樹 full binary tree

深度為h的滿二叉樹有(2^h)-1個結點

請添加圖片描述

由二叉堆的定義可以看出,跟結點一定是二叉堆中結點值最大(或最小)的。較大(或較小)的結點靠近根節點

堆的存儲結構:

一般情況下,堆用數組來存儲,第i個結點的父節點的下標就是(i-1)/2.
如果用層序遍歷順序將大頂堆和小頂堆存入數組,

則關系如圖:

請添加圖片描述

堆的重要操作

插入:插入一個元素之後,新元素首先被插入表層(即最後一層盡可能左邊的位置),之後再根據堆的性質進行調整。

例:寫出一次一個地將10,12,1,14,6,5,8,15,3,9,7,4,11,13和2插入一個初始為空的二叉堆的結果

請添加圖片描述請添加圖片描述

刪除:刪除總是發生在根處,之後將最後一個元素(即最後一層最右邊的元素)拿來填補空缺,之後根據堆的性質進行調整堆的結構。

到此這篇關於Java優先隊列 priority queue的文章就介紹到這瞭,更多相關優先隊列 priority queue內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: