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

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

  • 相关阅读:
    sql-trace-10046-trcsess-and-tkprof
    教你深入理解软件包的配置、编译与安装过程
    Java RESTful 框架的性能比较
    gcc、arm-Linux-gcc和arm-elf-gcc的组成及区别
    Linux线上系统程序debug思路及方法
    使用systemtap调试Linux内核 :www.lenky.info
    SystemTap使用技巧 1
    gvfs
    Systemtap examples, Network
    .NET 大型信息化建设标准基础数据管理平台
  • 原文地址:https://www.cnblogs.com/lzh66/p/13396416.html
Copyright © 2011-2022 走看看