zoukankan      html  css  js  c++  java
  • 如果需求是获得一组数据中的最大值的话,就可以用堆来实现

    二叉堆:任意一个节点的值都大于他的子节点,就叫做最大堆,任意一个节点的值都小于它的子节点,就叫做最小堆

    二叉堆又叫做完全二叉堆,是一个完全二叉树,因此,我们可以用数组来实现.

    二叉堆的添加

    public void add(E element) {
            elementNotNullCheck(element);
            ensureCapacity(size+1);
            elements[size++] = element;
            siftUp(size-1);
            
        }
    public void siftUp(int index){
            E element = elements[index];
            while(index > 0){
                int parentIndex = (index - 1) >> 1; 
                E parent = elements[parentIndex];
            
                if(compare(parent , element) > 0) break;
                elements[index] = parent;
                index = parentIndex;
            }
            elements[index] = element;
            
        }

    上滤操作。

    二叉堆的删除

    public E remove() {
            emptyCheck();
            int lastIndex = --size;
            E root = elements[0];
            elements[0] = elements[lastIndex];
            elements[lastIndex] = null;
            siftDown(0);
            return root;
        }
    public void siftDown(int index){
            E element = elements[index];
            int half = size >> 1;
            while(index < half){
                int childIndex = (index << 1) + 1;
                E child = elements[childIndex];
                int rightChild = childIndex +1;
                if(rightChild < size  && compare(child,elements[rightChild]) < 0){
                    child = elements[childIndex = rightChild];
                }
                
                if(compare(element,child) > 0) break;
                elements[index] = child;
                index = childIndex;
            }
            elements[index] = element;
        }

    下滤操作

    批量建堆

        public void heapify(){
            for(int i = (size >> 1) - 1 ; i >= 0 ; i--){
                siftDown(i);
            }
        }

    采用的是自下而上的下滤.

  • 相关阅读:
    作业呢
    留言板
    题解 lg2480 古代猪文
    题解 lg4139 上帝与集合的正确用法
    AFO
    题解 lg2946 [USACO09MAR]Cow Frisbee Team S
    题解 lg4158 [SCOI2009]粉刷匠
    题解 HDU4035 Maze
    题解 lg3232 [HNOI2013]游走
    题解 HDU4652 Dice
  • 原文地址:https://www.cnblogs.com/lzh66/p/13396416.html
Copyright © 2011-2022 走看看