优先队列那些事儿

如果要用最简单的话说明:什么是优先队列?
博主在《数据结构与算法分析》上找到了这样一句话:
优先队列是至少允许下列两种操作的数据结构:Insert,DeleteMin

实现方式?
我们在我们先前看过的数据结构中选择一样:
先看看他们的复杂度

数据结构 Insert DeleteMin
无序链表 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;
}

版权声明:本文为博主原创文章,转载请标明出处。

posted @ 2015-09-13 01:01  Fridge  阅读(138)  评论(0编辑  收藏  举报