• 如果需求是获得一组数据中的最大值的话,就可以用堆来实现

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

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

    二叉堆的添加

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

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

  • 相关阅读:
    activemq的两种基本通信方式的使用及总结
    EJBCA认证系统结构及相关介绍
    白话经典算法系列之一 冒泡排序的三种实现 【转】
    springcloud配置需要主要的地方
    Spring的RestTemplate
    mysql中的事务
    list去重
    webpack的使用
    rocketmq在linux搭建双master遇到的坑
    redis配置文件详解
  • 原文地址:https://www.cnblogs.com/lzh66/p/13396416.html
Copyright © 2020-2023  润新知