淺談優先佇列
淺談優先佇列
一道面試題
如果你被問到:
“編寫一個程式,從 10 億個元素的整數陣列中找出前10個最大的數。”
你會怎麼回答?
我想,最最簡單的回答就是蠻力法:先對這10億個數排序(比如用時間複雜度為
請問有更好的方法嗎?
優先佇列是什麼
普通的佇列是一種先進先出的資料結構:從隊尾追加元素,從隊首刪除元素。
在優先佇列中,元素被賦予優先順序。出隊時,具有最高優先順序的元素被刪除,也就是說,優先佇列具有最高優先順序先出(largest-in,first-out)的行為特徵。
優先佇列支援兩種基本操作:
- 向優先佇列插入一個新元素
- 刪除(或得到)優先佇列中優先順序最高的元素
對於本文開始的問題,如果你知道了有“優先佇列”這麼一說,則很容易想到下面的解決辦法:
- 建立大小為 10 的容器
- 從陣列中讀取一個數到變數
temp
- 如果容器沒有滿,則把
temp
加入容器;如果容器已滿,則找出容器中最小的數(利用優先佇列的性質)和temp
比較:若temp
較大,則最小元素出隊,temp
入隊;若temp
較小,轉到 4 - 重複2~3,直至讀完整個陣列,此時容器中的 10 個數就是所求。
此外,上述方案可以並行方式執行,最後合併結果。
除了上面的例子,優先佇列還有一些重要的應用場景。
比如作業(或者說任務)排程,當一個作業完成後,需要在所有等待排程的作業中選擇一個優先順序最高的作業來執行,並且也可以新增一個或多個新的作業到優先佇列中。
再比如排序,通過插入一系列元素,然後一個個地刪除其中最小的元素,就可以實現從小到大的排序。一種名為“堆排序”的重要排序演算法正是利用了基於“堆”實現的優先佇列。
優先佇列的實現
用無序陣列實現
對於入隊操作,直接把元素追加到陣列尾部。時間複雜度為 O(1)。
對於出隊操作,需要遍歷陣列,找出優先順序最高的元素,並刪除之,空缺的位置由後面的元素依次補上。因此,出隊的時間複雜度為 O(n)。
用有序陣列實現
對於入隊操作,由於要求陣列有序,所以在插入元素的時候需要遍歷陣列以找到適合的位置,然後在該位置插入,同時此位置後面的元素要依次向後移動,時間複雜度為 O(n)。
對於出隊,由於序列是有序的,所以時間複雜度為 O(1)。
用連結串列實現
用連結串列實現和陣列類似,也可分為無序和有序兩種,不同的是採用鏈式儲存結構,省去了移動元素的麻煩。
用堆實現
上面三種實現思路其實都不怎麼好,不是入隊的時間複雜度為 O(n),就是出隊的時間複雜度為 O(n). 有沒有更好的實現呢?有一種資料結構叫“堆”,基於堆實現的優先佇列,出隊和入隊的時間複雜度都為 O(logN).
堆到底是什麼,都有哪些性質,具體怎麼實現……這一系列的問題,我們們下回聊。
【未完待續】
相關文章
- PHP優先佇列PHP佇列
- STL 優先佇列 用法佇列
- 堆與優先佇列佇列
- 優先佇列和堆排序佇列排序
- 01揹包優先佇列優化佇列優化
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- 棧,佇列,優先順序佇列簡單介面使用佇列
- NO GAME NO LIFE(優先佇列/最小堆)GAM佇列
- 優先佇列的比較器佇列
- 封裝優先順序佇列封裝佇列
- 三、資料結構演算法-棧、佇列、優先佇列、雙端佇列資料結構演算法佇列
- STL優先佇列最小堆最大堆佇列
- leetcode621——優先佇列的思路LeetCode佇列
- 演算法面試(三) 優先佇列演算法面試佇列
- 二叉堆實現優先佇列佇列
- 手擼優先佇列——二叉堆佇列
- C++ STL 優先佇列 (priority_queue)C++佇列
- .NET 6 優先佇列 PriorityQueue 實現分析佇列
- Java優先順序佇列DelayedWorkQueue原理分析Java佇列
- 堆、堆排序和優先佇列的那些事排序佇列
- 最詳細版圖解優先佇列(堆)圖解佇列
- 【堆】【優先佇列】[NOIP2004]合併果子佇列
- Facebook的分散式優先順序佇列FOQS分散式佇列
- 8.13(優先佇列貪心維護+打表找規律+對頂堆優先佇列+DFS減枝+貪心dp)佇列
- 【Dijkstra演算法】未優化版+優先佇列優化版演算法優化佇列
- 深入淺出 MySQL 優先佇列(你一定會踩到的order by limit 問題)MySql佇列MIT
- codeforces round 974(div.3)E(優先佇列實現dijstra演算法,devc++的優先佇列用greater報錯)佇列JS演算法devC++
- CodeForces - 960B:Minimize the error(優先佇列+貪心)Error佇列
- Sunscreen POJ - 3614(防曬油) 貪心-優先佇列佇列
- [USACO 2009 Feb Gold] Fair Shuttle (貪心+優先佇列)GoAI佇列
- CSP之公共鑰匙盒(模擬、排序、優先佇列)排序佇列
- Python3 執行緒優先順序佇列( Queue)Python執行緒佇列
- MaxHeap 最大堆 MinHeap 最小堆 PriorityQueue 優先佇列實現佇列
- 談談訊息佇列的流派佇列
- Python 列表推導及優先順序佇列的實現Python佇列
- 個推基於 Apache Pulsar 的優先順序佇列方案Apache佇列
- RMQ——支援合併和優先順序的訊息佇列MQ佇列
- 資料結構之PHP(最大堆)實現優先佇列資料結構PHP佇列