1. 程式人生 > 實用技巧 >ADG常用查詢

ADG常用查詢

如果需求是獲得一組資料中的最大值的話,就可以用堆來實現

二叉堆:任意一個節點的值都大於他的子節點,就叫做最大堆,任意一個節點的值都小於它的子節點,就叫做最小堆

二叉堆又叫做完全二叉堆,是一個完全二叉樹,因此,我們可以用陣列來實現.

二叉堆的新增

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

採用的是自下而上的下濾.