优先队列总结

来源:互联网 发布:淘宝代绣十字绣可信吗 编辑:程序博客网 时间:2024/05/20 07:34

1.C++优先队列的使用示例

1.1 C++优先队列常规使用方法

头文件#include <queue>
声明如下:priority_queue<int, vector<int>, greater<int> >

#include <iostream>#include <queue>using namespace std;priority_queue<int, vector<int>, greater<int> >humble;int main(){    for(int i=5;i>0;i--)    {        humble.push(i);    }    while(!humble.empty())    {        cout<<humble.top()<<endl;        humble.pop();    }    return 0;}

1.2自定义优先队列

自定义优先队列需要在结构体中重载比较符。用法如下:

#include<iostream>#include<queue>using namespace std;struct treenode{    int weight;    int value;    friend bool operator< (treenode a, treenode b)    {        return a.value < b.value;    }};priority_queue<treenode> prique;int main(){    for (int i = 0; i < 4; i++)    {        treenode tempnode;        tempnode.value = 4-i;        tempnode.weight = i;        prique.push(tempnode);    }    cout<<prique.top().value;    return 0;}

2.C++优先队列的应用

杭电oj1058
http://acm.hdu.edu.cn/showproblem.php?pid=1058
题意:当一个数只有2、3、5、7这四种质因数时(也可以一种都没有或只有其中几种),这个数就是丑数,输出第 n 个丑数是多少;
解题思路:
首先生成丑数值小于2000000000的丑数数组:

设a[i]为存入第i个丑数的数组元素,pri_humble为递增的优先队列
(1)将1存入a[0];
(2)将2,3,5,7存入优先队列pri_humble中
(3)将优先队列中最小的值出队列存入数组的下一个元素(如a[1]=2)
(4)将这个最小的值分别乘以2,3,5,7加入到优先队列中
(5)重复(3)(4)步骤直到 2000000000
由于队列中会有重复数据,因此在出队列的时候判断与前一个数组元素是否相等,如果相等,继续下一个出队列

#include <iostream>#include <queue>using namespace std;priority_queue<long long, vector<long long>, greater<long long> >pri_humble;long long a[5851];int main(){    long long n;    long long k=1;    a[0]=1;//1.将1存入a[0];    pri_humble.push(2);//2.将2,3,5,7存入优先队列pri_humble中    pri_humble.push(3);    pri_humble.push(5);    pri_humble.push(7);    while(k<5850)    {        if(pri_humble.top()==a[k-1])//相等继续下一个出队列        {            pri_humble.pop();        }else//不相等,执行(3)(4)操作        {            a[k]=pri_humble.top();            pri_humble.pop();            pri_humble.push(a[k]*2);            pri_humble.push(a[k]*3);            pri_humble.push(a[k]*5);            pri_humble.push(a[k]*7);            k++;        }    }    while(cin>>n&&n!=0)//按题目格式输出    {        cout<<"The "<<n;        if(n%10 == 1 && n%100 != 11) cout<<"st ";        else if(n%10 == 2 && n%100 != 12) cout<<"nd ";        else if(n%10 == 3 && n%100 != 13) cout<<"rd ";        else cout<<"th ";        cout<<"humble number is "<<a[n-1]<<endl;    }    return 0;}

3堆排序

那么优先队列如何实现的呢?
因此需要用到常用数据结构中的堆
下面代码实现了新建一个堆,并用堆排序的算法
将算法导论的伪代码转换为c语言代码

#include <stdio.h>#include <stdlib.h>/* a为数组,s表示a的元素下标,n表示要调整堆的个数,作用为使s为根的子树成为最大堆*/int maxHeapify(int *a,int s,int n){    int largest=0;    int temp;    int left=s*2+1;    int right=left+1;    if(left<n&&a[left]>a[s])    {        largest=left;    }else{        largest=s;    }    if(right<n&&a[right]>a[largest])    {        largest=right;    }    if(largest!=s)    {        temp=a[s];        a[s]=a[largest];        a[largest]=temp;        maxHeapify(a,largest,n);    }    return 0;}int heapSort(int *a,int n){    int i;    int temp;    //建堆    for(i=n/2-1;i>=0;i--)    {        maxHeapify(a,i,n);    }    //堆排序    for(i=n-1;i>0;i--)    {        temp=a[0];        a[0]=a[i];        a[i]=temp;        maxHeapify(a,0,i);    }    return 0;}int main(){    int i;    int a[10]={14,16,3,4,7,2,8,9,1,10};    heapSort(a,10);    for(i=0;i<10;i++)    {        printf("%d\n",a[i]);    }    return 0;}

4.优先队列的实现

优先级队列是一种维护由一组元素构成的集合S的数据结构,这一组元素中的每一个都有一个关键字key。一个最大优先级队列支持以下操作:
insert(S,x):把元素x插入集合S。这一操作可写为S=S ∪ {x};
maximum(S):返回S中具有最大关键字的元素;
extract-max(S):去掉并返回S中的具有最大关键字的元素;
increase-key(S,x,k):将元素x的关键字的值增加到k,这里k值不能小于x的原始关键字的值

0 0