什么是堆?

菜园前端
• 阅读 347

原文链接:https://note.noxussj.top/?source=helloworld


什么是堆?

堆是一种特殊的完全二叉树。完全二叉树的含义就是每层节点都完全填满,除了最后一层外只允许最右边缺少若干个节点。在 JavaScript 中通常用数组表示堆(按照广度优先遍历顺序)。

最大堆

什么是堆?

最小堆

什么是堆?

特性

  • 所有的节点都大于等于它的子节点(最大堆)
  • 或者所有的节点都小于等于它的子节点(最小堆)
  • 左侧子节点的位置是 2 _ index + 1
  • 右侧子节点的位置是 2 _ index + 2 (也就是在左子节点的基础上 + 1)
  • 父节点的位置是 (index - 1) / 2

优点

  • 高效、快速的找出堆的最大值和最小值,时间复杂度是 O (1)
  • 找出第 K 个最大、最小元素

常用操作

插入

  • 将值插入堆的底部,即数据的尾部
  • 然后上移,将这个值和它父节点进行交换,直到父节点小于等于这个插入的值
  • 大小为 k 的堆中插入元素的时间复杂度为 O (logK)

删除堆顶

  • 用数组尾部元素替换堆顶(直接删除堆顶会破坏结构)
  • 然后下移,将新堆顶和它的子节点进行交换,直到子节点大于等于这个新堆顶
  • 大小为 k 的堆中删除堆顶的时间复杂度为 O (logK)

获取堆顶

  • 返回数组的第 0 项

获取堆大小

  • 返回数组的长度

基础案例

通过 Class 实现最小堆

class MinHeap {
    constructor() {
        this.heap = []
    }

    top() {
        return this.heap[0]
    }

    size() {
        return this.heap.length
    }

    getChildLeftIndex(i) {
        return i * 2 + 1
    }

    getChildRightIndex(i) {
        return i * 2 + 2
    }

    getParentIndex(i) {
        return (i - 1) >> 1
    }

    swap(index1, index2) {
        const temp = this.heap[index1]
        this.heap[index1] = this.heap[index2]
        this.heap[index2] = temp
    }

    shiftUp(index) {
        if (index === 0) return

        const parentIndex = this.getParentIndex(index)
        if (this.heap[parentIndex] > this.heap[index]) {
            this.swap(parentIndex, index)
            this.shiftUp(parentIndex)
        }
    }

    shiftDown(index) {
        const leftChildIndex = this.getChildLeftIndex(index)
        const rightChildIndex = this.getChildRightIndex(index)

        if (this.heap[leftChildIndex] < this.heap[index]) {
            this.swap(leftChildIndex, index)
            this.shiftDown(leftChildIndex)
        }

        if (this.heap[rightChildIndex] < this.heap[index]) {
            this.swap(rightChildIndex, index)
            this.shiftDown(rightChildIndex)
        }
    }

    insert(value) {
        this.heap.push(value)
        this.shiftUp(this.heap.length - 1)
    }

    pop() {
        this.heap[0] = this.heap.pop()
        this.shiftDown(0)
    }
}

const h = new MinHeap()
h.insert(3)
h.insert(2)
h.insert(1)
h.pop()
点赞
收藏
评论区
推荐文章
白茶清欢 白茶清欢
3年前
js实现二叉树、二叉查找树
树是一种数据结构,该章节讨论二叉树(二叉树的每个节点的子节点不允许超过两个),二叉树中有又分为完全二叉树和不完全二叉树.....不在本章节赘述相关概念,感兴趣可以去查阅《数据结构》。你将会获得:1.如何使用js实现二叉查找树。2.学会前、中、后序遍历。3.了解相关实现原理阅读时长5min,可选择直接调试代码特点    二叉查找树中序遍历后
Wesley13 Wesley13
3年前
java堆排序(大根堆)
实现堆排序的算法思路是先创建堆,也就是从叶子节点起对每一层的孩子节点及其对应位置的父亲节点进行比较,较大的孩子节点替换较小的父亲节点,一级一级比较替换,就创建出了大根堆,小根堆反之。创建好大根堆以后,我们,将整棵树的根节点与最后最后一个节点替换位置,然后去除最后一个节点,在创建一个新的大根堆,以此类推,完成排序。代码如下:/\\\<p堆排
九路 九路
4年前
4.2 手写Java PriorityQueue 核心源码
上一节介绍了PriorityQueue的原理,先来简单的回顾一下PriorityQueue的原理以最大堆为例来介绍1.PriorityQueue是用一棵完全二叉树实现的。2.不但是棵完全二叉树,而且树中的每个根节点都比它的左右两个孩子节点元素大3.PriorityQueue底层是用数组来保存这棵完全二叉树的。如下图,是一棵最大堆。
zhenghaoz zhenghaoz
3年前
算法笔记:红黑树
红黑树,一种平衡二叉树,最为著名的应用就是CSTL中的map,是有序集合最为理想的存储方式之一。除了二叉树所具有的属性之后,红黑树中每个节点多了一个“颜色”属性,可以是红色或者是黑色。一棵红黑树应该满足一下的性质:1.每个节点是红色或者黑色的;2.根节点是黑色的;3.每个叶节点nil是黑色的(使用哨兵节点在删除调整时可以方便不少);4.如
Wesley13 Wesley13
3年前
B树与B+树的区别?
1.B树简介B树是一种多路平衡搜索树。它由二叉树变换而来的。定义如下:1.1每个节点最多有m1个关键字1.2根节点最少有1个关键字1.3非根节点至少有m/2个关键字1.4每个节点的关键字都是按照从小到大的顺序排列,每个关键字的左子树中的关键字都小于它,而右子树中所有关键字都大于它。1.5所有的叶子节点都处于同
Wesley13 Wesley13
3年前
JAVA递归实现线索化二叉树
JAVA递归实现线索化二叉树基础理论首先,二叉树递归遍历分为先序遍历、中序遍历和后序遍历。先序遍历为:根节点左子树右子树中序遍历为:左子树根节点右子树后序遍历为:左子树右子树根节点(只要记住根节点在哪里就是什么遍历,且都是先左再右)线索化现在有这么一棵二叉树,它的数据结
可莉 可莉
3年前
10亿个数中找出最大的10000个数(top K问题)
这个问题还是建立最小堆比较好一些。    先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。建堆时间复杂度是O(mlogm),算法(https://www.oschina.net/action
Stella981 Stella981
3年前
Heapsort 和 priority queue
一、二叉堆含义及属性:堆(heap)亦被称为:优先队列(priorityqueue),是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因而实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解
菜园前端 菜园前端
1年前
什么是二叉树?
原文链接:什么是二叉树?树中每个节点最多只能有两个子节点,在JavaScript中一般都是通过Object来模拟二叉树。常用操作前序遍历中序遍历后序遍历前序遍历根左右。口诀:1.访问根节点2.对根节点的左子树进行前序遍历3.对根节点的右子树进行前序遍历通过
菜园前端 菜园前端
1年前
什么是图?
原文链接:什么是图?图是网络结构的抽象模型,是一组由边连接的节点。图可以表示任何二元关系,比如道路、航班等。在JavaScript中没有图,但是可以通过Object和Array来构建图。常用操作深度优先遍历广度优先遍历图的表示法邻接矩阵邻接表关联矩阵...