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);
            }
        }

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

  • 相关阅读:
    洛谷 P4160 [SCOI2009]生日快乐 题解
    洛谷 P1041 传染病控制 题解
    洛谷 P3154 [CQOI2009]循环赛 题解
    洛谷 P1144 最短路计数 题解
    洛谷 P2296 寻找道路 题解
    洛谷 P1514 引水入城 题解
    洛谷 P2661 信息传递 题解
    洛谷 P3958 奶酪 题解
    洛谷 P3501 [POI2010]ANT-Antisymmetry 题解
    【LGR-069】洛谷 2 月月赛 II & EE Round 2 Div.2 A-C题解
  • 原文地址:https://www.cnblogs.com/lzh66/p/13396416.html
Copyright © 2011-2022 走看看