二叉堆和優先隊列

二叉堆特色

  • 徹底二叉樹
  • 父親節點大於子節點。、
  • 只取出最大的元素,(堆頂)

二叉堆的基礎代碼,(根據完成二叉樹的特色,基於數組的一種實現Array是本身實現的線性表)

public class MaxHeap<E extends Comparable<E>> {
    private Array<E> data;

    public MaxHeap(int capacity) {
        data=new Array<>(capacity);
    }

    public MaxHeap() {
        data=new Array<>();
    }
    public int size(){
        return data.getSize();
    }

    public boolean isEmpty(){
        return data.isEmpty();
    }

    private int parent(int index){
        if (index == 0)
            throw new IllegalArgumentException("index 0 ");
        return (index-1)/2;
    }

    private int leftChild(int index){
        return index*2+1;
    }
    private int rightChild(int index){
        return index*2+2;
    }
}

複製代碼

向堆中添加元素,SiftUP

  • 在數組的最後添加一個元素
  • 和父親節點比較,siftup

從堆中刪除元素

public E extractMax(){
        E ret =findMax();
        data.swap(0,data.getSize()-1);
        data.removeLast();
         siftDown(0);


        return ret;

    }

    private void siftDown(int k) {
        while(leftChild(k)<data.getSize()){
            int j=leftChild(k);
            if (j+1<data.getSize()&&data.get(j+1).compareTo(data.get(j))>0)
                j++;

            // data[j] 是左右孩子中的最大值
            //data[j] he data[k] compare
            if (data.get(k).compareTo(data.get(j))>=0)
                break;
            data.swap(k,j);
            k=j;


        }
    }
    
    
    
複製代碼

替換元素

public E replace(E e){
        E ret=findMax();
        data.set(0,e);
        siftDown(0);
        return ret;
    } 
複製代碼

heapify 複雜度 log(N)

public MaxHeap(E[] arr){
    data=new Array<E>(arr);
    for (int i=parent(data.getSize()-1);i>=0;i--){
        siftDown(i);
    }

}
複製代碼

PriorityQueue

優先隊列能夠基於上面咱們本身實現的最大堆實現java

public class PriorityQueue<E extends Comparable<E>> implements Queue<E>{

    private MaxHeap<E> maxHeap;

    public PriorityQueue() {
        maxHeap=new MaxHeap<>();
    }

    @Override
    public int getSize() {
        return maxHeap.size();
    }

    @Override
    public boolean isEmpty() {
        return maxHeap.isEmpty();
    }

    @Override
    public void enqueue(E e) {
        maxHeap.add(e);

    }

    @Override
    public E dequeue() {
        return maxHeap.extractMax();
    }

    @Override
    public E getFront() {
        return maxHeap.findMax();
    }
}

複製代碼

java.utils.PriorityQueue

是最小堆,並且增長了許多新的特性。好比能夠在構造方法傳入Comparator比較器。api

相關文章
相關標籤/搜索