優先佇列(堆)

2021-09-13 19:35:35 字數 1434 閱讀 1598

優先佇列

普通的佇列是一種先進先出的資料結構,元素在佇列尾追加,而從佇列頭刪除。在優先佇列中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先刪除。優先佇列具有最高端先出 (largest-in,first-out)的行為特徵。
在某些資料處理的例子中,總資料量太大,無法排序(甚至無法全部裝進記憶體)。例如,需要從十億個元素中選出最大的十個,你真的想把乙個10億規模的陣列排序嗎?但有了優先佇列,你只用乙個能儲存十個元素的佇列即可。具體做法是讓元素乙個個輸入,只要優先佇列的個數大於10,就不斷刪除最小元素,最後優先佇列長度不大於10時停止刪除,只剩10個自然就是所有元素中最大的10個了。很多情況我們會收集一些元素,處理當前鍵值最大(或最小)的元素,然後再收集更多的元素,再處理當前最大的(或最小的)元素,這可以看成我們按照事件的優先順序順序來處理,生活中很多任務都是有優先順序高低之分的,所以優先佇列可以高效地處理這些情況。

優先佇列最重要的操作是刪除最大元素插入元素

優先佇列不同資料結構實現的優先順序

資料結構

插入元素

刪除最大元素

有序陣列n1

無序陣列1n

堆logn

logn

理想情況11

資料結構的二叉堆能很好的實現優先佇列的基本操作。在二叉堆中,每個元素要保證大於等於另兩個特定位置的元素。
堆(heap)也被稱為優先佇列(priority queue)。佇列中允許的操作是先進先出(fifo),在隊尾插入元素,在隊頭取出元素。而堆也是一樣,在堆底插入元素,在堆頂取出元素,但是堆中元素的排列不是按照到來的先後順序,而是按照一定的優先順序排列的。這個優先順序可以是元素的大小或者其他規則。如圖一所示就是乙個堆,堆優先順序就是大的元素排在前面,小的元素排在後面,這樣得到的堆稱為最大堆。最大堆中堆頂的元素是整個堆中最大的,並且每乙個分支也可以看成乙個最大堆。同樣的,我們可以定義最小堆,如圖二所示。

插入元素

向堆中插入乙個新元素;在堆的最末尾插入新結點。然後自下而上調整子結點與父結點:比較當前結點與父結點,不滿足堆性質則交換,使得當前子樹滿足二叉堆的性質。時間複雜度為 o(logn)。

刪除最大元素

刪除堆頂元素,再把堆儲存的最後那個結點填在根結點處。再從上而下調整父結點與它的子結點。時間複雜度為 o(logn)。

優先佇列《堆》

1.模型 兩個基本操作 insert等價enqueue deletemin刪除最小者 dequeue 2.簡單的實現 1 簡單鍊錶 遍歷刪除min或者排序刪除min 2 使用二叉查詢樹。反覆除去min會使得樹不平衡,並且bst還支援許多不需要的操作。3.二叉堆 優先佇列的實現普遍使用二叉堆,堆有兩個...

優先佇列 堆

印表機列印作業一般是放在佇列中的。如果按照先來先列印的順序,有乙個100頁的列印任務,那麼會讓後面短小的任務等待很長時間。更合理的做法也許是最後處理最耗時的列印任務,不管它是不是最後提交上來的。在多使用者作業系統中,作業系統讓哪個程式使用cpu,是需要決定從佇列裡面選擇的。一般做法是從隊頭獲得程式,...

優先佇列 堆

優先佇列 佇列是乙個操作受限的線性表,資料只能在一端進入,另一端出來,具有先進先出的性質。有時在佇列中需要處理優先順序的情況,即後面進入的資料需要提前出來,這裡就需要優先佇列。優先佇列是至少能夠提供插入和刪除最小值這兩種操作的資料結構。對應於佇列的操作,插入相當於入隊,刪除最小相當於出隊。鍊錶,二叉...