当前位置: 首页 > news >正文

【JavaScript】数据结构之堆

什么是堆?

  • 堆都能用树来表示,一般树的实现都是利用链表。
  • 二叉堆 是一种特殊的堆,它用完全二叉树来表示,却可以利用数组实现。平时使用最多的是二叉堆。
  • 二叉堆易于存储,并且便于索引。
  • 堆数据结构像树,但是,是通过数组来实现的(不是通过链表是通过二叉堆)。
  • 最小堆就是从小到达排序,最大堆相反。

实现堆

  • 因为是数组,所以父子节点的关系就不需要特殊的结构去维护,索引之间通过计算就可以得到,省掉了很多麻烦。如果是链表结构,就会复杂很多。
  • 完全二叉树要求叶子节点从左往右填满,才能开始填充下一层,这就保证了不需要对数组整体进行大片的移动。这也是随机存储结构(数组)的短板,即删除一个元素之后,整体往前移是比较费时的。这个特性也导致堆在删除元素的时候,要把最后一个叶子节点补充到树根节点的缘由。
  • 二叉堆像树的样子我可以理解,但将他们安排在数组里的话,通过当前下标怎么就能找到父节点和子节点呢?(父节点、左子树和右子树)
    • 左子树:index * 2 + 1
    • 右子树:index * 2 + 2
    • 父节点:( index - 1 )/ 2

实现最小堆

class MinHeap {constructor() {this.heap = []}// 换位置swap(i1, i2) {let temp = this.heap[i1]this.heap[i1] = this.heap[i2]this.heap[i2] = temp}// 找到父节点getParentIndex(index) {return Math.floor((index - 1) / 2)}// 上(前)移操作up(index) {if (index === 0) returnconst parentIndex = this.getParentIndex(index)if (this.heap[parentIndex] > this.heap[index] ) {this.swap( parentIndex, index )this.up(parentIndex)}}// 找到左侧子节点getLeftIndex(index) {return index * 2 + 1}// 找到右侧子节点getRigthIndex(index) {return index * 2 + 2}// 下(后)移操作down(index) {const leftIndex = this.getLeftIndex(index)const rightIndex = this.getRigthIndex(index)if (this.heap[leftIndex] < this.heap[index]) {this.swap(leftIndex, index)this.down(leftIndex)}if (this.heap[rightIndex] < this.heap[index]) {this.swap(rightIndex, index)this.down(rightIndex)}}// 添加元素insert( value ) {this.heap.push(value)this.up( this.heap.length-1 )}// 删除堆顶pop() {this.heap[0] = this.heap.pop()this.down(0)}// 获取堆顶peek() {return this.heap[0]}// 获取堆长度size() {return this.heap.length}
}let arr = new MinHeap()
arr.insert(5)
arr.insert(4)
arr.insert(6)
arr.insert(1)
arr.pop()
console.log(arr)
console.log(arr.size())
console.log(arr.peek())

leetcode 习题

堆习题

http://www.lryc.cn/news/443544.html

相关文章:

  • 工程车辆目标检测、程车检测算法、工程车辆类型检测算法
  • 【技术文章】ArcGIS Pro如何批量导出符号和工程样式?
  • javascript的闭包学习
  • JavaScript高级—— js 是单线程运行的
  • Java 微服务框架 HP-SOA v1.1.4
  • 代码随想录Day 52|题目:101.孤岛的面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿
  • go webapi上传文件
  • 【小沐学GIS】基于Openstreetmap创建Sionna RT场景(Python)
  • 网安面试题1
  • 你了解system V的ipc底层如何设计的吗?消息队列互相通信的原理是什么呢?是否经常将信号量和信号混淆呢?——问题详解
  • python爬虫初体验(一)
  • ER 图 Entity-Relationship (ER) diagram 101 电子商城 数据库设计
  • JavaSE--IO流总览06:字符转换输入(输出)流: InputStreamReader ,OutputStreamWrite
  • 浙版传媒思迈特软件大数据分析管理平台建设项目正式启动
  • 漏洞——CVE简介
  • IT行业中的技术趋势与未来展望
  • 解决 webpack 配置 sass-loader后报错,无法正常build
  • CentOS中使用DockerCompose方式部署带postgis的postgresql(附kartoza/docker-postgis镜像下载)
  • 初识elasticsearch
  • react hooks--React.memo
  • App端测——稳定性测试
  • [数据结构与算法·C++] 笔记 1.4 算法复杂性分析
  • Hive parquet表通过csv文件导入数据
  • C++ 构造函数最佳实践
  • C++——关联式容器(4):set和map
  • Spring Mybatis 基本使用 总结
  • 接口幂等性和并发安全的区别?
  • 【记录一下VMware上开虚拟端口映射到公网】
  • 半导体器件制造5G智能工厂数字孪生物联平台,推进制造业数字化转型
  • 数据结构之存储位置