【算法】在JS中实现Heap堆及堆操作

什么是Heap?

Heap是一种满足堆属性的专用基于树的数据结构。在一个堆中,对于任何给定节点(除了根节点),该节点的值始终根据其父节点排序。

这种排序可以是以下两种类型:

  1. **最大堆:**在最大堆中,对于除根节点外的每个节点,节点的值最多等于其父节点的值。这意味着最大的元素位于根节点,随着向下遍历树,元素变得更小。简单来说,所有子节点都必须小于其父节点。
  2. **最小堆:**在最小堆中,对于除根节点外的每个节点,节点的值至少等于其父节点的值。这意味着最小的元素位于根节点,随着向下遍历树,元素变得更大。

堆的特点

堆还是一颗完全二叉树,这意味着树的所有层级都是完全填充的,如果最后一层不完整,节点会从左到右填充。

优先队列经常使用二叉堆实现,尽管这不是实现的唯一方式。当我们希望根据某些优先级值对队列进行排序时,它用于排序队列。

这意味着每个元素都有一定的优先级。元素的优先级决定了元素从优先队列中删除的顺序。

堆的实现

实现堆最简单的方法是不使用二叉树,而是使用一个数组数据结构。这是因为它们是完全二叉树。

通过使用数组,我们还确保树中没有间隙(除了最后一层必须从左到右填充),允许一种紧凑的表示,而不会浪费任何空间。

如果你仔细观察这个二叉堆,你会注意到每个节点下面都有一个索引,表示它在数组表示中的索引。

如果我们切换到数组视图,这就是我们的二叉堆的样子:

我们使用基于1的索引,这意味着我们不计算数组中的第0个项,根节点开始于索引1。在这种情况下,如果一个节点在数组中的索引为 i

  • 如果左子节点存在,则其索引为2*i。
  • 如果右子节点存在,则其索引为2*i+1。
  • 如果其父节点存在且 i 不是1(根节点),则其父节点索引为 ⌊i/2⌋。

这意味着根节点从 arr[1] 开始,左节点是 arr[2],右节点是 arr[3] 等等。

这种表示利用了完全二叉树的属性,允许在不需要基于指针/引用的树节点结构之间轻松导航到父节点和子节点。

堆操作

堆的主要操作包括插入元素,提取最大/最小元素以及堆化以维护堆属性。

我建议查看这些操作的可视化表示以更好地理解它们。

插入

class Heap {  constructor() {  // 在这里使用 null 初始化堆以使用基于1的索引this.heap = [null];  }  // 将新值插入堆中  insert(value) {  this.heap.push(value);  this.heapifyUp(this.heap.length - 1);  }  // 在插入后堆化以维护堆属性  heapifyUp(index) {  while (index 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/573818.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java:反射 reflection ( 概念+相关类+使用方法)

文章目录 一、反射(reflection)1.概念优点:缺点 2.反射的相关类1.Class类1.**反射机制的起源**2.获得类相关的方法3.获得类中属性的相关方法4.获得类中注解相关的方法5.获得类中构造器相关的方法6.获得类中方法相关的方法 2.获取Class对象的三种方法:1.使…

报表生成器FastReport .Net用户指南:脚本示例

FastReport的报表生成器(无论VCL平台还是.NET平台),跨平台的多语言脚本引擎FastScript,桌面OLAP FastCube,如今都被世界各地的开发者所认可,这些名字被等价于“速度”、“可靠”和“品质”,在美国&#xff…

Phoenix伪分布安装

引言 Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入数据和对HBase数据进行查询。Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫…

怎么看电脑是32位还是64位?

不同的操作系统会有不同的操作功能,适应不同的软件。最近有网友想了解自己的电脑是几位数的,相信很多小伙伴也有同样的疑惑吧,搞不清楚系统是32位还是64位。其实,我们通过计算机即可查看,操作方法很简单,接…

如何开始定制你自己的大型语言模型

2023年的大型语言模型领域经历了许多快速的发展和创新,发展出了更大的模型规模并且获得了更好的性能,那么我们普通用户是否可以定制我们需要的大型语言模型呢? 首先你需要有硬件的资源,对于硬件来说有2个路径可以选。高性能和低性…

Anaconda的GEE环境中安装torch库

打开Anaconda,点击运行,打开terminal 输入pip install torch 而且由于anaconda中自己配置好了镜像源,在pip时自动使用清华镜像源

OpenAI文本转视频模型Sora运行成本高昂;抖音打击利用AI生成虚拟人物违规行为

🦉 AI新闻 🚀 OpenAI文本转视频模型Sora运行成本高昂 摘要:市场调查机构Factorial Funds最新报告显示,OpenAI旗下文本转视频模型Sora在峰值期需要达到72万片英伟达H100 AI加速卡,相当于成本约216亿美元。每片H100的功…

java解决跨域问题

浏览器js在访问服务器中的资源时,会出现同一页面或者不同域名(协议,IP,端口)不可访问 例如:file://d://test.html页面(file协议)中通过ajax访问服务器api.test.com的接口(http协议),由于协议不同,此时会出现浏览器访问…

U盘未格式化?数据恢复大揭秘!

在日常办公和生活中,U盘已成为我们不可或缺的数据存储工具。然而,有时我们会遇到这样一个令人头疼的问题:原本正常使用的U盘,突然提示“未格式化”,里面的文件似乎都消失不见了。面对这种情况,很多人会感到…

力扣热门算法题 124. 二叉树中的最大路径和,125. 验证回文串,127. 单词接龙

124. 二叉树中的最大路径和,125. 验证回文串,127. 单词接龙,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.26 可通过leetcode所有测试用例。 目录 124. 二叉树中的最大路径和 解题思路 完整代码 Pyt…

Ubuntu安装教程——Desktop版本(细致入微的操作)

目录 前言 一、安装Ubuntu桌面版操作系统 二、UbuntuLive版安装 1.语言选择 2.键盘布局 3.版本选择 4.网络配置 5.代理配置 6.镜像地址 7.磁盘划分 8.设置用户信息 9.ssh 10.选择软件包 11.安装界面 12.基础配置 12.1root用户 12.2时区 12.3包管理工具 12…

tcp和udp的区别是什么

tcp和udp的区别是什么 TCP(传输控制协议)和UDP(用户数据报协议)是互联网协议族中的两个重要传输层协议。 一、工作原理 1.TCP工作原理: TCP是一种面向连接的协议,通过三次握手建立可靠的连接。发送端将数…