算法导论 第六章:优先级队列
来源:互联网 发布:mac键盘怎么拆 编辑:程序博客网 时间:2024/05/22 21:22
虽然堆排序的时间复杂度为O(nlgn),但在实际中,快速排序(下一章将介绍)往往要优于堆排序。尽管如此,堆数据结构在其他方面有着很大的用处,如用于优先级队列的实现。因为堆可让优先级队列的所有操作的时间复杂度为O(lgn)。最大优先级队列常用于共享主机上的作业调度,最小优先级队列常用于事件驱动的模拟中。
以最大优先级队列为例,其支持的操作如下:
1)INSERT(S,x): 向集合中插入元素x
2)MAXIMUM(S): 返回集合S的最大值
3)EXTRACT-MAX(S):删除集合S的最大值
4)INCREASE-KEY(S,x,k):将集合S中的元素x的值增加为k
最大优先级队列实现的完整代码如下:
#include<iostream>#include<cstdlib>#include<climits>#define PARENT(i) (i/2)#define LEFT(i) (2*i)#define RIGHT(i) (2*i+1)using namespace std;void Print(int *a){int n=a[0];for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<endl;}int *Transform(int *a,int n){ int * A=new int[n+1]; A[0]=n; for(int i=0;i<n;i++) A[i+1]=a[i]; return A;}void swap(int &a,int &b){int temp;temp=a;a=b;b=temp;}void Max_Heapify(int *A,int i){//adjust the heap to maintain the heap propertyint heap_size=A[0];int l=LEFT(i) ; //index of i's left childint r=RIGHT(i);int largest; //At each step,the largest of the element A[i],A[LEFT(i)] //A[RIGHT(i)] is determined,and its index is stored in largest. if(l<=heap_size && A[l]>A[i])largest= l;elselargest = i;if(r<=heap_size && A[r]>A[largest])largest = r;if(largest!=i) //the subtree rooted at i violate the max-heap property{ swap(A[i],A[largest]);Max_Heapify(A,largest); //after exchanging ,the subtree rooted at largest might violate the max-heap property }}void Build_MaxHeap(int *A){//Transform array A into max-heap A,where A[0]=heap-sizeint A_length=A[0];for(int i=A_length/2;i>=1;i--)Max_Heapify(A,i);}int GetHeapMaximum(int *A){//return the elements of S with the largest keyBuild_MaxHeap(A);return A[1];}int Heap_ExtractMax(int *A){int max;int heap_size;heap_size=A[0];if(heap_size<1){ cout<<"heap underflow"<<endl;return -1;}Build_MaxHeap(A);max=A[1];A[1]=A[heap_size];heap_size--;A[0]=heap_size;Max_Heapify(A,1);return max;}void Heap_IncreaseKey(int *A,int i,int key){Build_MaxHeap(A); if(key<A[i]){cout<<"new key is smaller than the current key."<<endl;return;}A[i]=key;while(i>1 && A[PARENT(i)]<A[i]) {swap(A[PARENT(i)],A[i]);i=PARENT(i); }}void Heap_InsertKey(int *A,int key){int heap_size=A[0];heap_size=heap_size+1;A[0]=heap_size;A[heap_size]=INT_MIN;Heap_IncreaseKey(A,heap_size,key);}int main(){int a[]={4,1,3,2,16,9,10,14,8,7};int n=sizeof(a)/sizeof(int);int *A=new int[n+1];cout<<"---------------Init the set--------------------"<<endl;cout<<"After initing,S[1..n] is:"<<endl;A=Transform(a,n); //Transform a[0...n-1] into a[1...n];a[0]=a.lengthPrint(A);cout<<"---------------Excute MAXIMUM------------------"<<endl;int hMaxN;hMaxN=GetHeapMaximum(A);cout<<"The largest key is:"<<hMaxN<<endl;cout<<"------------Excute EXTRACT-MAX-----------------"<<endl;hMaxN=Heap_ExtractMax(A);cout<<"The largest key is:"<<hMaxN<<endl;cout<<"After removing the largest,the heap is:"<<endl;Print(A);cout<<"------------Excute INCREASE-KEY----------------"<<endl;int key=11;int index=6;Heap_IncreaseKey(A,index,key);cout<<"After increasing ,the heap is:"<<endl;Print(A);cout<<"--------------Excute HEAP-INSERT---------------"<<endl;int ikey=13;Heap_InsertKey(A,ikey);Print(A);cout<<"-----------------------------------------------"<<endl;return 0;}
运行结果如下:
若有错误,请指正~~~
0 0
- 算法导论第六章 优先级队列
- 算法导论 第六章:优先级队列
- 堆实现优先级队列(算法导论第六章)
- 《算法导论》第六章-优先级队列(伪代码)
- 《算法导论》第六章之堆和优先级队列相关算法C语言实现
- 算法导论-优先级队列
- 【算法导论】第六章 再谈 堆排序和最大优先级队列
- 《算法导论》第六章----优先级队列(代码实现+部分练习)
- 算法导论 第六章优先队列总结
- 《算法导论》 6.5优先级队列
- 《算法导论》第6章 堆排序 (2)优先级队列
- 《算法导论》读书笔记之第6章 优先级队列
- 《算法导论》笔记 第6章 6.5优先级队列
- 算法导论 第六章优先队列C++实现
- 算法导论第六章之——优先队列
- 算法导论第六章6.5优先队列课后答案。
- 算法导论第六章__实现优先队列
- 《算法导论》笔记--优先级队列
- hashMap的遍历
- android.os.NetworkOnMainThreadException异常
- cocos2d学习之旅(一)
- Sql Server (cast的用法)
- C#文件结构
- 算法导论 第六章:优先级队列
- linux编程基础(part2)
- C6_函数
- MyEclipse历史版本
- 论文阅读笔记:Fully Convolutional Networks for Semantic Segmentation
- OpenCV函数cvFindContours
- 分布式服务框架 Zookeeper
- ConcurrentHashMap原理分析
- 答读者问(30):一个大一学生有关未来技术方向的疑问及答复