數據結構-JavaScript實現堆

什麼是堆?
這裏的堆和內存的堆是不一樣的,這裏的堆是一種儲存方式。
堆其實是一種優先隊列,也就是說隊列中存在優先級,比如隊列中有很多待執行任務,執行時會根據優先級找優先度最高的先執行。
堆的實現
一般使用完全二叉樹實現堆。
最大堆:一棵完全二叉樹中父親節點永遠 大於 兒子節點。
最小堆:一棵完全二叉樹中父親節點永遠 小於 兒子節點。
另外從根節點,到任意節點路徑上都是有序的。如下圖
在這裏插入圖片描述
左邊藍色爲最大堆,右邊紅色爲最小堆

下面爲最小堆代碼實現

{
    /**
     * 最小堆
     */
    class MinHeap {
        // 最大長度
        private maxSize: number;
        size: number = 0;
        private data: Array<any> = [];

        constructor(length: number) {
            this.maxSize = length;
        }
        insert(value: any) {
            if (this.size == this.maxSize) {
                console.log('堆已滿');
                return;
            }
            let i = ++this.size;
            // 如果要插入的值小於父節點,就持續過濾
            for (; this.data[Math.floor(i / 2)] > value && i > 1; i = Math.floor(i / 2)) {
                // 過濾,直到找個合適的插入位置i
                this.data[i] = this.data[Math.floor(i / 2)];
            }
            this.data[i] = value;
        }
        /**
         * 最小堆刪除
         */
        delete(): any {
            // 父節點,也是堆尾部的值要插入的地方
            let parent: number,
                // 子節點
                child: number;
            if (this.size <= 0) {
                console.log('堆爲空');
                return;
            }
            const minItem = this.data[1];
            // 把最小堆中的最後一個元素從根節點開始從上到下過濾節點
            const temp = this.data[this.size--];
            // 如果根節點的左兒子位置小於等於最大節點數,則說明左兒子下還有節點
            for (parent = 1; parent * 2 <= this.size; parent = child) {
                // 完全二叉樹,左兒子爲當前層級乘以2,右兒子爲當前層級乘以2加1
                child = parent * 2;
                // 如果左兒子的位置不等於最大節點數,則說明還有右兒子。然後從左右兒子中選最小的
                if (child != this.size && this.data[child] > this.data[child + 1]) {
                    child++;
                }
                // 如果比最小的還小,代表所處的位置合適,跳出循環
                if (temp <= this.data[child]) {
                    break;
                } else {
                    // 否則移動temp到下一層
                    this.data[parent] = this.data[child];
                }
            }
            this.data[parent] = temp;
            return minItem;
        }
        print() {
            for (let index = 1; index <= this.size; index++) {
                console.log(this.data[index]);
            }
        }
    }
    const heap = new MninHeap(7);
    heap.insert(5);
    heap.insert(6);
    heap.insert(7);
    heap.insert(3);
    heap.insert(2);
    heap.insert(9);
    heap.print();
    console.log('-------刪除');
    console.log(heap.delete());
    console.log('刪除之後------')
    heap.print();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章