【九月打卡】第4天 数据结构之“堆”
课程名称:JavaScript版数据结构与算法
课程章节:第10章 数据结构之“堆”
主讲老师:lewis
课程内容:
今天学习的内容包括:
10-1 堆简介——堆是一种特殊的完全二叉树。
10-2 JavaScript 实现:最小堆类——基于数组和深度优先遍历方法达成最小堆类相关操作。
10-3 LeetCode:215. 数组中的第 K 个最大元素——pop出K以外的最小值,获取堆顶即可。
课程收获:
堆简介
1、堆是一种特殊的完全二叉树。
2、所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点。
JS中的堆
1、JS中通常用数组表示堆。
2、左侧子节点的位置是2* index + 1。
3、右侧子节点的位置是2 * index + 2。
4、父节点位置是(index - 1)/2。
堆的应用
1、堆能高效、快速地找出最大值和最小值,时间复杂度:O(1)。
2、找出第K个最大(小)元素。
第K个最大元素
1、构建一个最小堆,并将元素依次插入堆中。
2、当堆的容量超过K,就删除堆顶。
3、插入结束后,堆顶就是第K个最大元素。
JavaScript 实现:最小堆类
插入
1、将值插入堆的底部,即数组的尾部。
2、然后上移:将这个值和它的父节点进行交换,直到父节点小于等于这个插入的值。
3、大小为K的堆中插入元素的时间复杂度为O(logk)。
this.heap.insert()
swap(parentIndex,index)
删除堆顶
1、用数组尾部元素替换堆顶(直接删除堆顶会破坏堆结构)。
2、然后下移:将新堆顶和它的子节点进行交换,直到子节点大于等于这个新堆顶。
3、大小为k的堆中删除堆顶的时间复杂度为O(logk)。
this.heap.pop()
swap(leftIndex,index)
swap(rightIndex,index)
获取堆顶和堆的大小
1、获取堆顶:返回数组的头部。
2、获取堆的大小:返回数组的长度。
peek(){
return this.heap[0]
}
size(){
return this.heap.length
}
215. 数组中的第 K 个最大元素:可以使用最小堆实现
1、构建一个最小堆,并依次把数组的值插入堆中。
2、当堆的容量超过K,就删除堆顶。
3、插入结束后,堆顶就是第K个最大元素。
4、pop方法中会对最小堆进行一次处理,可以确保获取K值的准确性。
const h = new MinHeap()
nums.forEach(n=>{
h.insert(n)
if(h.size() > k){
h.pop()
}
})
return h.peek()
今天学习了数据结构之“堆”,感觉还不错,学知识就像喝酒一样,迷迷糊糊,晕晕乎乎,也许醉了,或许还没醉,也许会了,可能还没会,今天先到这把,对自己说一句,加油😀~
坚持打卡,坚持学习!明天见💪~
共同学习,写下你的评论
评论加载中...
作者其他优质文章