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

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

  • 相关阅读:
    I.MX6 sdio 设备注册及识别
    linux串口查看命令
    连词
    相形-声似词汇
    replace A with B是用A代替B还是用B代替A?
    无监督、弱监督、半监督、强化、多示例学习是什么
    JS散度(Jensen-Shannon)
    embedding是什么
    httpclient: 设置请求的超时时间,连接超时时间等
    httpclient工具使用(org.apache.httpcomponents.httpclient)
  • 原文地址:https://www.cnblogs.com/lzh66/p/13396416.html
Copyright © 2011-2022 走看看