为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第4天 数据结构之“堆”

标签:
JavaScript

课程名称: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()

今天学习了数据结构之“堆”,感觉还不错,学知识就像喝酒一样,迷迷糊糊,晕晕乎乎,也许醉了,或许还没醉,也许会了,可能还没会,今天先到这把,对自己说一句,加油😀~

坚持打卡,坚持学习!明天见💪~

https://img1.sycdn.imooc.com//63194e970001450e24051437.jpg

https://img1.sycdn.imooc.com//6319567a00017d5023901441.jpg

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消