1. 程式人生 > >優先順序佇列(priority queue)屌絲版

優先順序佇列(priority queue)屌絲版

1、佇列(queue)想必大家已經知道了,是一種先進先出的思想,在英國人眼裡就是line(排),而我們的中文 排隊,我想大概也就是這麼翻譯過來的(斗膽猜一下,前輩勿怪)

 

2、優先順序佇列(priority queue),可以說是一種特殊的佇列,其實就是每個元素經過排序的佇列(queue),首先它也是隻有一個隊頭和一個隊尾,當然是也從隊頭delete,從隊尾insert,優先順序佇列(priority queue)最重要的特點就是:是按照元素的規則(你來制定)進行了排序,每次插入或者移除的時候可以進行排序,這樣就保證隊頭每次都指向的是最高級別或者最低級別的元素(看你排序是升序還是降序了)。

別稱:有序佇列,有序佇列,有序佇列

3、書中形象的使用了日常生活中的收到的信件做了比喻,你有一堆信件,最上面的是最優先要處理的,也就是隊頭,壓在最下面的就是最後要處理的,就是隊尾。還是插圖,比較形象,每次插入新的信件時,當然是從隊尾插了,只不過作了排序,就是任意位置插入了(除了隊頭)

 

4、上程式碼了,我們在普通佇列(queue)中進行改造,就不加入到迴圈佇列(loop queue)中了,而且是降序的優先順序佇列(priority queue),每次插入的元素,都要與原來的元素進行對比,已找到合適的位置,所以插入很慢, 刪除快(廢話,都是隊頭刪,能不快嗎),而且仍然使用陣列作為儲存結構哦

 

 

5、我去,終於談到了優先順序佇列的插入,每次插入的時候,都要與原來的元素進行對比,然後找到合適的位置,放入元素,所以插入時慢一些,因為每次都要把元素做一個對比

 

6、有一個好問題:優先順序佇列是插入的時候排序,還是移除的時候排序?什麼時候對元素排序,讓當前的佇列一直保持有序狀態呢?這裡指的是常規的雙向連結串列實現的優先順序佇列

答:如果是插入的時候排序,那麼每次插入的話,效率稍微差點(因為每次插入一個元素,就要做排序),如果是移除的時候再去排序,那麼插入的元素都先暫放在佇列尾部,等要移除佇列頭部,即隊頭元素的時候,再把每個插入的元素逐個(只要沒排序的)都進行一次排序,那麼只要有沒有排序的元素存在,移除就會變慢了,不過排序完成後,隊頭移除的時間複雜度仍為O(1)

 

7、優先順序佇列的資料結構使用,首先可以用連結串列(雙向連結串列,雙向迴圈連結串列),另外就是用二叉排序樹(當然底層是用的連結串列,這個我後面要認真總結)

 

8、優先順序佇列,還有個美麗的名字,叫做有序佇列,而且需求中,經常會用到這個資料結構,非常重要。。

 

9、上文部分內容是我摘抄的書籍,有談到使用陣列實現的有序佇列、也有連結串列的實現的有序佇列,還有二叉排序樹實現的有序佇列

 

 

priority queue