1. 程式人生 > >優先佇列詳解

優先佇列詳解

說到佇列,我們首先想到就是先進先出,後進後出;那麼何為優先佇列呢,在優先佇列中,元素被賦予優先順序,當訪問元素時,具有最高階優先順序的元素先被訪問。即優先佇列具有最高階先出的行為特徵。

優先佇列在標頭檔案#include <queue>中;

其宣告格式為:priority_queue <int> ans;//宣告一個名為ans的整形的優先佇列

基本操作有:

empty( )  //判斷一個佇列是否為空

pop( )  //刪除隊頂元素

push( )  //加入一個元素

size( )  //返回優先佇列中擁有的元素個數

top( )  //返回優先佇列的隊頂元素


優先佇列的時間複雜度為O(logn),n為佇列中元素的個數,其存取都需要時間。


在預設的優先佇列中,優先順序最高的先出隊。預設的int型別的優先佇列中先出隊的為佇列中較大的數。


然而更多的情況下,我們是希望可以自定義其優先順序的,下面介紹幾種常用的定義優先順序的操作:

[cpp]  view plain  copy
  1. #include <iostream>
      
  2. #include <vector>  
  3. #include <queue>  
  4. using namespace std;  
  5. int tmp[100];  
  6. struct cmp1  
  7. {  
  8.      bool operator ()(
    int x, int y)  
  9.     {  
  10.         return x > y;//小的優先順序高  
  11.     }  
  12. };  
  13. struct cmp2  
  14. {  
  15.     bool operator ()(const int x, const int y)  
  16.     {  
  17.         return tmp[x] > tmp[y];   
  18.         //tmp[]小的優先順序高,由於可以在隊外改變隊內的值,  
  19.         //所以使用此方法達不到真正的優先,建議用結構體型別。  
  20.     }  
  21. };  
  22. struct node  
  23. {  
  24.     int x, y;  
  25.     friend bool operator < (node a, node b)  
  26.     {  
  27.         return a.x > b.x;//結構體中,x小的優先順序高  
  28.     }  
  29. };  
  30.   
  31. priority_queue<int>q1;  
  32. priority_queue<int, vector<int>, cmp1>q2;  
  33. priority_queue<int, vector<int>, cmp2>q3;  
  34. priority_queue<node>q4;  
  35. int main()  
  36. {  
  37.     int i,j,k,m,n;  
  38.     int x,y;  
  39.     node a;  
  40.     while(cin>>n)  
  41.     {  
  42.         for(int i=0;i<n;i++)  
  43.         {  
  44.             cin>>a.y>>a.x;  
  45.             q4.push(a);  
  46.         }  
  47.         cout << endl;  
  48.         while(!q4.empty())  
  49.         {  
  50.             cout<<q4.top().y <<" "<<q4.top().x<<endl;  
  51.             q4.pop();  
  52.         }  
  53.         cout << endl;  
  54.     }  
  55.     return 0;  
  56. }  




說到佇列,我們首先想到就是先進先出,後進後出;那麼何為優先佇列呢,在優先佇列中,元素被賦予優先順序,當訪問元素時,具有最高階優先順序的元素先被訪問。即優先佇列具有最高階先出的行為特徵。

優先佇列在標頭檔案#include <queue>中;

其宣告格式為:priority_queue <int> ans;//宣告一個名為ans的整形的優先佇列

基本操作有:

empty( )  //判斷一個佇列是否為空

pop( )  //刪除隊頂元素

push( )  //加入一個元素

size( )  //返回優先佇列中擁有的元素個數

top( )  //返回優先佇列的隊頂元素


優先佇列的時間複雜度為O(logn),n為佇列中元素的個數,其存取都需要時間。


在預設的優先佇列中,優先順序最高的先出隊。預設的int型別的優先佇列中先出隊的為佇列中較大的數。


然而更多的情況下,我們是希望可以自定義其優先順序的,下面介紹幾種常用的定義優先順序的操作:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <vector>  
  3. #include <queue>  
  4. using namespace std;  
  5. int tmp[100];  
  6. struct cmp1  
  7. {  
  8.      bool operator ()(int x, int y)  
  9.     {  
  10.         return x > y;//小的優先順序高  
  11.     }  
  12. };  
  13. struct cmp2  
  14. {  
  15.     bool operator ()(const int x, const int y)  
  16.     {  
  17.         return tmp[x] > tmp[y];   
  18.         //tmp[]小的優先順序高,由於可以在隊外改變隊內的值,  
  19.         //所以使用此方法達不到真正的優先,建議用結構體型別。  
  20.     }  
  21. };  
  22. struct node  
  23. {  
  24.     int x, y;  
  25.     friend bool operator < (node a, node b)  
  26.     {  
  27.         return a.x > b.x;//結構體中,x小的優先順序高  
  28.     }  
  29. };  
  30.   
  31. priority_queue<int>q1;  
  32. priority_queue<int, vector<int>, cmp1>q2;  
  33. priority_queue<int, vector<int>, cmp2>q3;  
  34. priority_queue<node>q4;  
  35. int main()  
  36. {  
  37.     int i,j,k,m,n;  
  38.     int x,y;  
  39.     node a;  
  40.     while(cin>>n)  
  41.     {  
  42.         for(int i=0;i<n;i++)  
  43.         {  
  44.             cin>>a.y>>a.x;  
  45.             q4.push(a);  
  46.         }  
  47.         cout << endl;  
  48.         while(!q4.empty())  
  49.         {  
  50.             cout<<q4.top().y <<" "<<q4.top().x<<endl;  
  51.             q4.pop();  
  52.         }  
  53.         cout << endl;  
  54.     }  
  55.     return 0;  
  56. }