您的位置:首页 > 其它

优先队列那些事儿

2015-09-13 01:01 295 查看

如果要用最简单的话说明:什么是优先队列?

博主在《数据结构与算法分析》上找到了这样一句话:

优先队列是至少允许下列两种操作的数据结构:Insert,DeleteMin



实现方式?

我们在我们先前看过的数据结构中选择一样:

先看看他们的复杂度

数据结构InsertDeleteMin
无序链表O(1)O(n)(遍历n寻找最小元素)
有序链表O(n)(寻找插入位置)O(1)
二叉查找数O(logn)O(logn)
是不是有更有效的实现呢?

二叉堆

堆是这样一种数据结构:就是所有父结点都比子结点要小。

例如这样

13
/  \
21   16
/  \  / \
24  31 19 68
/  \ /
65 26 32


那么,它的两种操作的算法应该是

void Insert(int x,priority_queue q){
for(i=q.size()+1;x<q.elements[i/2];i/=2){
q.eletments[i]=q.eletemnet[i/2];
}
q.elements[i]=x;
}


解释一下

int DeleteMin(priority_queue q){
if(isEmpty()) error();
int min=q.elements[1];//得到了最小值
int lastone=q.elements[q.size()--];
int child;//接下来一个要被上率的位置
for(int i=1;i*2<=q.size();i=child){
child=i*2;
if(child!=q.size()&&q.elements[child+1]>q.elements[i])
child++;
if(lastone>q.elements[child])
q.elements[i]=q.elements[child];
else
break;
}
q.elements[i]=lastone;
return min;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: