演算法(四)優先佇列

2021-10-06 11:16:22 字數 2492 閱讀 3364

演算法(三)複雜排序

演算法(二)簡單排序

演算法(一)基礎資料結構

前言正文

佇列承擔著很多軟體中非常重要的的功能,由於其先進先出的性質讓其非常適合用於訊息或者程序的等待佇列以及快取功能。而程序的等待佇列顯然不能單純使用先進先出的原理,這樣的排程雖然簡單,但是會使得後進入程序需要等待非常長的時間才能輪到其執行,並且有時候某些程序是緊急執行的,也就是說需要有優先順序的差別,優先順序高的自然也應該先執行。

因此本節將完成相關優先佇列以及索引優先佇列的構造,優先佇列自然不必說,而優先索引佇列是在優先佇列的基礎上增加了索引項,因為有些時候我們不需要返回乙個物件,而是該元素的索引即可,用索引代指元素。

優先佇列適用於當給與資料非常龐大或者實時更新佇列時的情況。因為優先佇列採用堆排序,堆排序的特點即:不需要對所有元素排序即可獲取到最大(最小)元素,並且如果堆已經構造完畢,每次刪除堆頂節點時只需要o(logn)的複雜度即可讓堆重新有序。這是非常節省資源的一種資料結構,當然,索引優先佇列與索引佇列的性質大致是一致的。

優先佇列構造沒有除了堆的處理外沒有任何其他困難操作,直接展示實現:(這裡構造最小堆)

注意:構造堆時可以不使用第0號元素,這裡選擇使用0號元素

public

class

minpq

comparable

>

//判斷是否為空

public

boolean

isempty()

//插入新元素

public

void

insert

(key v)

//刪除最小元素

public key delmin()

//下沉操作

public

void

sink

(int m)

}//上浮操作

public

void

swim

(int m)

}}

顯然,delmin()insert()方法都非常簡單,但是構造的資料結構卻非常實用。當遇到類似取出topn個元素時使用本資料結構非常高效。

索引優先佇列即在二叉堆中存的不再是插入元素,而是元素對應的索引,而索引優先佇列最大的優勢在於他可以通過索引獲取或者刪除當前佇列中的元素。這樣我們就可以對優先佇列中的元素進行實時更新,這對於圖的處理非常有意義,因為當構建最小生成樹時或者使用最短路徑的相關演算法時,有時會出現加入當前節點後一些已經在優先佇列中的節點失效,需要刪除或者更改節點,這時索引優先佇列發揮了巨大的靈巧性。

實現索引優先佇列最難點在於如何能夠判斷該索引節點是否在二叉堆中,顯然遍歷堆是一種方式,但是每次查詢索引都需要遍歷一邊的話,時間耗費非常大,因此我們可以使用乙個逆序陣列,即將二叉堆陣列的鍵值對調,可以通過索引來查詢在二叉堆中的位置,並可以設定二叉堆中沒有的元素的值為-1。

當然每次更新堆時需要同時更新逆序陣列,但是這對時間複雜度並沒有太大影響。

實現依然以最小堆為例。

補充:如果索引不是單純的數字,如長字串等,則需要將所有陣列都改為map。

public

class

indexminpq

comparable

>

//向優先佇列中插入元素

public

void

insert

(int k, item v)

//刪除最小元素,返回的是刪除元素索引

public

intdelmin()

//獲取最小元素的內容

public item min()

//判斷當前索引對應元素是否在佇列中

public

boolean

contains

(int k)

//更改存在元素的內容

public

void

change

(int k, item v)

//刪除指定索引的元素

public

void

delete

(int k)

}

當然從上也可以看出,可以只更改exchange函式來同時操作pqqp兩個陣列,這樣sink以及swim函式將不用變化。(這裡不再重複sink以及swim函式)

演算法之優先佇列

1 概念 優先順序佇列,顧名思義,就是一種根據一定優先順序儲存和取出資料的佇列。它可以說是佇列和排序的完美結合體,不僅可以儲存資料,還可以將這些資料按照我們設定的規則進行排序。優先順序佇列是堆的一種常見應用。有最大優先順序佇列 最大堆 和最小優先順序佇列 最小堆 優先順序佇列是一種維護有一組元素構成...

演算法導論 優先佇列

堆的應用 優先佇列。什麼是優先佇列?優先佇列是一種從來維護一組由元素構成的集合s的資料結構,其中每乙個元素都乙個值,被稱為關鍵字。優先佇列可以用堆來實現。優先佇列可以分為最大優先佇列 最小優先佇列。最大優先佇列支援的操作有 1.insert 2.maximum 3.extract max 4.inc...

每日演算法 優先佇列

鏈結 前 k 個高頻元素 給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 class solution int 的第乙個元素代表陣列的值,第二個元素代表了該值出現的次數 p...