優先級隊列+堆

優先級隊列 是不同於先進先出隊列的另一種隊列。每次從隊列中取出的是具有最高優先權的元素。

優先隊列是0個或多個元素的集合,每個元素都有一個優先權或值,對優先隊列執行的操作有:

  Create ( ):創建一個空的優先隊列

  Size ( ):返回隊列中的元素數目
  Max ( ):返回具有最大優先權的元素
  I n s e rt (x):將x插入隊列
      DeleteMax (x):從隊列中刪除具有最大優先權的元素,並將該元素返回至x。
優先級隊列的幾種實現方式:
1)數組:
     有序的時候: insert() 爲 O(n) ,因爲要向後移動, Max() 爲O(1), 
     無序的時候:  insert() 爲O(1),Max() 爲 O(n) ,因爲要比較n次。
     綜合n的數的隊列時,插入需要O(n^2)
2)  鏈表:大概分析同數組一樣。
3)堆——此方法爲最好的情況。
     insert() 爲O(log n),Max() 爲 O(1) ,但是DeleteMax() 爲O(log n), 即調整堆的時間,所以對於元素個數爲n的隊列,insert() 爲O(n *log n ).
堆插入元素t,另x[n]=t,n=n+1,shiftup(n)
堆刪除堆頂元素, 先記錄x[0],然後另 x[1]=x[n], n=n-1, siftdown(n).
堆使用的數組x[0...n]需要n+1個字的額外內存。

由此得到堆排序的算法:
for( i=2; i<=n; i++)
       siftup( i);//  siftup(n),從i =n 開始進行調整,i=i/2
for(i=n; i>=2; i--)
{
      printf( x[1]);
      swap(1,i);
      siftdown(i-1);//從i=1 開始調整, i=2i 或者 i=2i+1.  括號裏面的參數表述堆元素的個數,並不代表開始調整的堆元素的位置。
}
// 自己很容易搞混的地方,shiftup 總是從最後一個元素開始的,shitfdown 總是從第一個元素開始的,括號裏始終表示堆裏剩餘元素的個數。



優先隊列插入和刪除元素的複雜度都是O(lgn),所以很快。
  另一種描述方法是採用有序線性表,當元素按遞增次序排列,使用鏈表時則按遞減次序排列,這兩種描述方法的刪除時間均爲( 1 ),插入操作所需時間爲(n).
  DeleteMax (x):從隊列中刪除具有最大優先權的元素,並將該元素返回至x
  }
  優先隊列插入和刪除元素的複雜度都是O(lgn),所以很快。e ( ):創建一個空的優先隊列
  Size ( ):返回隊列中的元素數目
  Max ( ):返回具有最大優先權的元素
  I n s e rt (x):將x插入隊列
  DeleteMax (x):從隊列中刪除具有最大優先權的元素,並將該元素返回至x
  }
  優先隊列插入和刪除元素的複雜度都是O(lgn),所以很快。

發佈了19 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章