• 特殊的完全二叉树

    所有节点大于等于它的子节点

    JS中常用数组表示堆

    - 左侧子节点:2*index+1;

    - 右侧子节点:2*index+2

    - 父节点:(index-1)/2

    用处:快速找出最大值最小值;找出第K个最大最小元素;

    // #### 堆
    // 特殊的完全二叉树
    // 所有节点大于等于它的子节点JS中常用数组表示堆
    
    // - 左侧子节点:2*index+1;
    // - 右侧子节点:2*index+2
    // - 父节点:(index-1)/2
    
    // 用处:快速找出最大值最小值;找出第K个最大最小元素;
    
    class Minheap{
        constructor(){
            this.heap = [];
        }
        swap(i1, i2){
            const temp = this.heap[i1];
            this.heap[i1] = this.heap[i2]
        }
        //获取父节点
        getParentIndex(i){
            // return Math.floor((i-1)/2)
            return (i-1) >> 1;
        }
        getLeftIndex(i){
            return i * 2 + 1;
        }
        getRightIndex(i){
            return i * 2 + 2;
        }
        //交换
        swap(i1,i2){
            const temp = this.heap[i1];
            this.heap[i1] = this.heap[i2];
            this.heap[i2] = temp;
        }
        //上移
        shiftUp(index){
            const parentIndex = this.getParentIndex(index);
            if(this.heap[parentIndex]> this.heap[index]){
                this.swap(parentIndex,index);
                this.shiftUp(parentIndex);
            }
        }
        //下移
        shiftDown(index){
            const leftIndex = this.getLeftIndex(index);
            const rightIndex = this.getRightIndex(index);
            if(this.heap[leftIndex]<this.heap[index]){
                this.swap(leftIndex,index);
                this.shiftDown(leftIndex);
            }
            if(this.heap[rightIndex]<this.heap[index]){
                this.swap(rightIndex,index);
                this.shiftDown(rightIndex);
            }
        }
        insert(value){
            this.heap.push(value);
            this.shiftUp(this.heap.length-1);
        }
        pop(){
            this.heap[0] = this.heap.pop();
            this.shiftDown(0);
        }
        //获取堆顶
        peek(){
            return this.heap[0];
        }
        size(){
            return this.heap.length;
        }
    }
    
    const h = new Minheap();
    h.insert(3);
    h.insert(2);
    h.insert(1);
    h.pop();
    // https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
    // https://leetcode-cn.com/problems/merge-k-sorted-lists/
    
  • 相关阅读:
    201671010410 冯婷秀 实验三 作业互评与改进
    读《构建之法》感想
    实验十四 团队项目评审&课程学习总结
    201671010412 郭佳 实验四附加实验
    201671010412 郭佳 英文文本统计分析
    201671010412 郭佳 实验二 软件工程个人项目
    201671010412 郭佳 实验三 作业互评与改进
    在阅读《现代软件工程—构建之法》后的思考问题
    金生芳-实验十四 团队项目评审&课程学习总结
    实验四 附加实验-项目互评
  • 原文地址:https://www.cnblogs.com/knightoffz/p/15685554.html
Copyright © 2020-2023  润新知