数据库——优先级队列(堆的应用)(外加TOPK问题 面试常考问题)

一.概念

   在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象。在这种情况下,我们的数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。 这种数据结构就是优先级队列(Priority Queue)

二.优先级队列的实现方式——堆

三.操作

   1.入队列(以小堆为例)

      <1.将数组元素以尾插插入数组中

      <2.比较其与双亲结点的值,比他大 则不动;比他小,进行交换

      <3.持续进行上述操作 直至到达根结点

     代码:

public void offer(int i) {
     array[size++]=i;//因为插入元素的下标位置为数组末尾即size处,且插入后size需要加加
     shiftUpSmall(array,size-1);
}//入队 插入元素 当前的堆尾 进行小堆的向下调整

   2.出队列(以小堆为例)(是删除元素) 

     <1.因为直接将树顶元素出的话,剩下的树不会平衡 所以需要进行交换

     <2.将当前树顶与树的最后一个元素进行交换,再对新的树顶进行向下的小堆调整

    代码:

   public int poll(){
        int element=array[0];
        array[0]=array[--size];//先减减 在使用 获取当前队尾下标 出队之后整体元素数减1
        Heap.shiftDownSmall(array,size,0 );//使用小堆来建立新堆
        return element;
    }//出队
    //将当前堆的最后一个元素与要出堆的元素(堆顶)进行交换 输出
    //对当前堆顶进行小堆向下调整

    3.返回队首元素(直接返回即可)(不用删除)

    代码:

    public int peek(){
        return array[0];
    }//返回队首元素(不删除)

四.错误处理的两种不同的返回值

       错误处理 抛出异常  返回特殊值

       入队列     add(e)      offffer(e)

       出队列     remove()  poll()

       队首元素 element()  peek()

五.TOPK问题(重点)

TOPK问题(从海量数据中找到k个最大的)
    操作:从数组中取k个元素,建立一个小堆。堆顶为这几个数 中最小的元素,将数组中的剩余元素依次与其比较,比堆顶小的元素坑定比堆内所有元素都小,如果大于堆顶 则取代当前堆顶,并进行小堆的调整。持续直至最后一个元素
    伪代码:
    heap[k]=createHeapBig(arr[1,k]);
    for(i=k+1;i<array.length;i++){
         shiftDownSmall(heep[k],array.length-k,arr[i]);
    }
    returnheap[k];

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值