数据库——优先级队列(堆的应用)(外加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];
发布了40 篇原创文章 · 获赞 4 · 访问量 868

猜你喜欢

转载自blog.csdn.net/weixin_44919969/article/details/101564409