《演算法導論》學習總結——第二部分2優先順序隊列

來源:互聯網
上載者:User

      如堆一樣,隊列也有2種,最大優先順序隊列和最小優先順序隊列。最大優先順序隊列的一個應用是在一台分時電腦上進行作業調度(終於搞到點有用的),對於最大優先順序隊列,支援以下操作:

     1)INSERT(S,x)把元素x插入隊列S

     2)MAXIMUM(S):返回S中最大元素

    3)EXTRACT-MAX(S):去掉並返回S中最大元素

 4)INCRESE-KEY(S,x,key)在x位置插入值key。

     優先順序隊列,用堆實現,這就是看到的必殺運用了。

    我們以82頁圖為例

示範程式如下:

//============================================================================// Name        : prioity.cpp// Author      : xia// Version     : 1.0// Copyright   : NUAA// Description : 優先順序隊列的類比實現//============================================================================#include <iostream>#include <climits> //INT_MIN#include <vector> //vector#include <algorithm>//for_eachusing namespace std;int Parent(int i){//返回i節點的父節點if (i>0)return i/2;return -1;}void MaxHeapify(vector<int> &v ,int i ,int heap_size){//讓A[i]在最大堆中下降,使以i為根的子樹成為大頂堆int left=2*i; //l<-LEFT(i)int right = 2*i+1; //r<-RIGHT(i) int largest=i;  if ( (left <= heap_size)  && (v[left] > v[i]) ) largest = left ;  else  largest = i; if ( (right <=heap_size ) && (v[right] > v[largest]) ) largest = right;//從父母和自己中找出最大的  if (largest != i) { swap(v[i],v[largest]);//交換使i和子堆滿足堆性質,不過largest為根的可能違反,遞迴調整 MaxHeapify(v,largest, heap_size); } }void BuildHeap(vector<int> &v){//建堆for (int i=v.size()/2 ; i > 0 ; i--)MaxHeapify(v,i,v.size()-1); }int HeapMaximum(vector<int> A){ //返回堆上的最大元素return A[1];}int HeapExtractMax(vector<int> &A ){ //去掉並返回A中最大的值int heap_size = A.size()-1;if ( heap_size <1 ){cout << " heap underflow" << endl;exit(EXIT_FAILURE);}int max = A[1];A[1] = A[heap_size];heap_size--; A.pop_back();MaxHeapify(A,1 ,heap_size);return max;}void HeapIncreaseKey(vector<int> &A , int i, int key){ //在i處插入值為key的數,並調整堆if (key<A[i]){cout << " new key is smaller than current key " << endl;exit(EXIT_FAILURE);}A[i] = key;while ( (i>1) && (A[Parent(i)] < A[i])){swap(A[i],A[Parent(i)]);i = Parent(i) ;}}void MaxHeapInsert(vector<int> &A , int key){A.push_back(INT_MIN); //虛擬碼heapsize+1,且插入負無窮HeapIncreaseKey(A,A.size()-1,key);//第二個參數實際為堆大小}template <class T> class Print { public:  void operator () (T& t)  { cout << t << " ";  }};const int heap_size = 10; //這裡假設元素為10個int main(){int temp[heap_size]={16,14,10,8,7,9,3,2,4,1};vector<int> v(temp+0,temp+heap_size);Print<int> print;v.insert(v.begin(),0);//插入個0,切合虛擬碼BuildHeap(v); //雖然我們的數組順序已經符合堆,不過常理還是要先建堆cout << "初始堆V " << endl;for_each(v.begin()+1,v.end(),print);//遍曆輸出cout << endl<< endl;cout <<"插入個試試 " << endl;HeapIncreaseKey(v,9,15);//p82圖for_each(v.begin()+1,v.end(),print);cout << endl << endl;cout << "提取個" << endl;cout << "max = " << HeapExtractMax(v) << endl;for_each(v.begin()+1,v.end(),print);cout << endl << endl ;cout << "再提取個" << endl;cout << "max = " << HeapExtractMax(v) << endl;for_each(v.begin()+1,v.end(),print);cout << endl << endl;cout << "插入個" << endl;MaxHeapInsert(v,20);for_each(v.begin()+1,v.end(),print);cout << endl << endl;return 0;}

運行結果如下:

     程式各部分的說明在原始碼中,添加說明如下:

    1、 為了更接近虛擬碼,我們將vector的0位置不用,於是left[i]=2*i,right[i]=2*i+1;

    2、雖然我們的初始數組已經符合堆概念,不過這隻是巧合,對於任意數組,我們應該首先對其建堆,BuildHeap
    看起來,第二步插入,只是如書82頁的圖,對優先順序進行了改變,而第五步的插入數,則更像是新到一個作業,很像作業調度吧?哈哈,堆,想不到也是進階貨。。。

     抄書上一句話,一個堆,可以在O(lgn)時間內,支援大小為n的集合上的任意優先隊列操作。

     看到MAX-HEAP-INSERT過程,有沒有很眼熟?根據思考題6.1,其實我們建堆的時候,可以用MaxHeapInsert過程,不夠這樣建堆,感覺跟插入排序沒什麼兩樣了。

過程如下:

    

void BuildMaxHeap(vector<int> &v){     v.clear();     for (int i=0 ; i<v.size() ; i++)           MaxHeapInsert(A,v[i]);}

      第六章的一些想法:

      關於堆排序,個人覺得, 其實也是類似選擇排序,每次選出最大的,只是比較都是每個子,左右三個節點進行,排序中規模會減少,雖然這個與選擇是一樣,不過堆引入遞迴(插入也有遞迴,其實也快不了多少,所以堆排序快的因素不是遞迴),而且堆有劃分的想法,對每個子堆分別進行。如同快排的劃分,使得上下半部分不用進行比較,從而與選擇排序比大大減少了比較次數。

      關於優先順序隊列,以前知道隊列調度,雖然可以用隊列進行調度,不過藉助堆這樣的結構去組織,清晰的畫出圖之後,發現理解會更深刻一點,也更形象。

     

       菜鳥goes on ~~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.