《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅱ

2.4.2初级实现


我们知道,基础数据结构是实现优先队列的起点。我们可以是使用有序或无序的数组或链表。在队列较小时,大量使用两种主要操作之一时,或是所操作元素的顺序已知时,它们十分有用。因为这些实现相对简单,我们在这里只能给出文字描述。


2.4.2.1数组实现(无序)


或许实现优先队列的最简单方法就是使用下压栈方式。insert()方法的代码和栈的push()方法完全一样,要实现删除最大元素,我们可以添加一段类似于选择排序的内循环的代码,将最大元素和边界元素交换然后删除它,和我们对栈的pop()方法的实现一样。和栈类似,我们也可以加入调整数组大小的代码来保证数据结构中至少含有四分之一到元素而又永远不会溢出。


2.4.2.2数组实现(有序)


另一种方法就是在insert()方法中添加代码,将所有较大的元素向右边一定一格以使数组保持有序(和插入排序一样)。这样,最大的元素总会在数组的一边,优先队列的删除最大元素操作就和栈的pop()操作一样了。


用数组实现优先队列:(insert已经进行有序操作。pop操作即为peekMax,remove操作)

 

public class PriorityQ {
    private int maxSize;
    private long[] queArray;
    private int nItems;
    
    //constructor
    public PriorityQ(int s){
        maxSize = s;
        queArray = new long[maxSize];
        nItems = 0;
    }
    
    //insert
    public void insert(long item){
        int j;
        if(nItems == 0)
            queArray[nItems++] = item;
        else{
            for(j=nItems-1; j>=0; j--){
                if(item > queArray[j])
                    queArray[j+1] = queArray[j]; 
                else
                    break;
                
            }//end for
            queArray[j+1] = item;
            nItems++;
        }//end else
    }
    
    public long remove(){
        return queArray[--nItems];
    }
    
    public long peekMin(){
        return queArray[nItems - 1];
    }
    
    public long peekMax(){
        return queArray[0];
    }
    
    public boolean isEmpty(){
        return nItems == 0;
    }
    
    public boolean isFull(){
        return nItems == maxSize;
    }
}

 


2.4.2.3链表表示法


和刚才类似,我们可以用基于链表的下压栈的代码作为基础,而后可以选择修改pop()来找到并返回最大元素,或是修改push()来保证所有元素为逆序并用pop()来删除并返回链表的首元素(也就是最大的元素)。


使用无序序列是解决这个问题的惰性方法,我仅在必要的时候才会采取兴都(找出最大元素);使用有序序列则是解决问题的积极方法,因为我们会尽肯能未雨绸缪(在插入元素时就保持链表有序),使后续操作更高效。


实现栈或是队列与实现优先队列的最大不用在于对性能的要求。对于栈和队列,我们的实现能够在常熟时间内完成所有操作;而对于优先队列,我们刚刚讨论过的所有初级实现中,插入元素和删除最大元素这两个操作之一在最坏情况下需要线性时间来完成。我们接下来要讨论的基于数据结构堆的实现能够保证这两种操作都能更快地执行。


表2.4.4 优先队列的各种实现在最坏情况下运行时间的增长数量级
数据结构
插入元素
删除最大元素
有序数组N1
无序数组1N
logNlogN
理想情况11



在一个优先队列上执行一系列操作




 

 

转载于:https://www.cnblogs.com/Destiny-Gem/p/3795700.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值