前端算法:堆

目录

一、堆

1.堆是什么?

2.堆的性质

3.堆的实现

4.基本操作

5.时间复杂度

 二、代码实现

1.最大堆实现

2.最小堆实现


一、堆

1.堆是什么?

堆能用树来表示,并且一般树的实现都是通过链表,而二叉堆是一种特殊的堆,它用完全二叉树来表示,却可以利用数组来实现。

平时使用最多的是二叉堆,它可以用完全二叉树俩表示,二叉堆易于存储,并且便于索引。

注意:堆的数据结构像树,但是通过数组实现、

2.堆的性质

  • 最大堆:每个节点的值都大于或等于其子节点的值,根节点是最大值。
  • 最小堆:每个节点的值都小于或等于其子节点的值,根节点是最小值。

3.堆的实现

  1. 通常使用数组实现。对于任意节点在索引 i
    • 父节点的索引为 (i - 1) / 2
    • 右子节点的索引为 2*i + 2
    • 左子节点的索引为 2*i + 1

4.基本操作

  • 插入:将新元素添加到数组末尾,随后进行“上浮”操作,保持堆的性质。
  • 删除(通常是删除根节点):将根节点与最后一个节点交换,移除最后节点,随后进行“下沉”操作,恢复堆的性质。

5.时间复杂度

插入和删除操作的时间复杂度为 O(log n),而查找最大/最小值的时间复杂度为 O(1)。

 二、代码实现

1.最大堆实现

class MaxHeap {constructor() {this.heap = [];}// 插入元素insert(value) {this.heap.push(value);this.bubbleUp();}// 向上调整bubbleUp() {let index = this.heap.length - 1;while (index > 0) {const parentIndex = Math.floor((index - 1) / 2);if (this.heap[index] <= this.heap[parentIndex]) break;[this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];index = parentIndex;}}// 移除最大值extractMax() {if (this.heap.length === 0) return null;if (this.heap.length === 1) return this.heap.pop();const max = this.heap[0];this.heap[0] = this.heap.pop();this.bubbleDown();return max;}// 向下调整bubbleDown() {let index = 0;const length = this.heap.length;while (true) {let leftChildIndex = 2 * index + 1;let rightChildIndex = 2 * index + 2;let largest = index;if (leftChildIndex < length && this.heap[leftChildIndex] > this.heap[largest]) {largest = leftChildIndex;}if (rightChildIndex < length && this.heap[rightChildIndex] > this.heap[largest]) {largest = rightChildIndex;}if (largest === index) break;[this.heap[index], this.heap[largest]] = [this.heap[largest], this.heap[index]];index = largest;}}// 查看最大值peek() {return this.heap[0] || null;}// 获取堆的数组表示getHeap() {return this.heap;}
}// 使用示例
const maxHeap = new MaxHeap();
maxHeap.insert(10);
maxHeap.insert(20);
maxHeap.insert(5);
console.log(maxHeap.getHeap()); // [ 20, 10, 5 ]
console.log(maxHeap.extractMax()); // 20
console.log(maxHeap.getHeap()); // [ 10, 5 ]

2.最小堆实现

class MinHeap {constructor() {this.heap = [];}// 插入元素insert(value) {this.heap.push(value);this.bubbleUp();}// 向上调整bubbleUp() {let index = this.heap.length - 1;while (index > 0) {const parentIndex = Math.floor((index - 1) / 2);if (this.heap[index] >= this.heap[parentIndex]) break;[this.heap[index], this.heap[parentIndex]] = [this.heap[parentIndex], this.heap[index]];index = parentIndex;}}// 移除最小值extractMin() {if (this.heap.length === 0) return null;if (this.heap.length === 1) return this.heap.pop();const min = this.heap[0];this.heap[0] = this.heap.pop();this.bubbleDown();return min;}// 向下调整bubbleDown() {let index = 0;const length = this.heap.length;while (true) {let leftChildIndex = 2 * index + 1;let rightChildIndex = 2 * index + 2;let smallest = index;if (leftChildIndex < length && this.heap[leftChildIndex] < this.heap[smallest]) {smallest = leftChildIndex;}if (rightChildIndex < length && this.heap[rightChildIndex] < this.heap[smallest]) {smallest = rightChildIndex;}if (smallest === index) break;[this.heap[index], this.heap[smallest]] = [this.heap[smallest], this.heap[index]];index = smallest;}}// 查看最小值peek() {return this.heap[0] || null;}// 获取堆的数组表示getHeap() {return this.heap;}
}// 使用示例
const minHeap = new MinHeap();
minHeap.insert(10);
minHeap.insert(20);
minHeap.insert(5);
console.log(minHeap.getHeap()); // [ 5, 10, 20 ]
console.log(minHeap.extractMin()); // 5
console.log(minHeap.getHeap()); // [ 10, 20 ]

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

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

相关文章

GO基础(string相关)

本博文包含了18个小内容&#xff0c;有判断字符串是否以另一个字符串开头、字符串包含关系判断、4、判断非ASCII编码字符、字符串替换、统计字符串出现的次数、重复字符串、修改字符串大写、修改字符串小写、剔除字符串开头和结尾的空白符号、剔除指定字符、剔除开头字符串、剔…

Lua环境安装

软考鸭微信小程序 学软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua是一种轻量级、小巧且易于嵌入应用程序的脚本语言&#xff0c;广泛用于游戏开发、Web开发、自动化脚本等领域。本文将详细介绍如何在不同操作系统上安装L…

蓝桥杯注意事项

蓝桥杯注意事项 比赛注意事项 能暴力枚举就暴力枚举&#xff0c;能用简单的思路做就尽量用简单的思路做。认真审核题目的题意和输入输出的要求&#xff0c;避免因为误解题意而导致题目错误。对于提供多组测试样例或者需要对一个过程重复进行循环的代码&#xff0c;要时刻记住…

六大设计原则之一——单一职责原则

单一职责原则 面向对象三大特性之一的 封装 指的就是将单一事物抽象出来组合成一个类&#xff0c;所以我们在设计类的时候每个类中处理的是单一事物而不是某些事物的集合。 设计模式中所谓的 单一职责原则(Single Responsibility Principle - SRP)&#xff0c;就是对一个类而…

【硬啃Dash-Fastapi-Admin】03-requirements-pg.txt 速览

文章目录 dash2.18.1 纯Python的Web应用框架Python Dash库的功能介绍和用法示例功能介绍用法示例 Flask-Compress1.15 Flask响应数据的压缩功能介绍用法示例注意事项 feffery-antd-charts0.1.0rc5 数据可视化组件库功能介绍用法示例 feffery-antd-components0.3.8 Dash 第三方组…

autMan奥特曼机器人-实时翻译的用法

一、基本配置 访问并登录百度翻译开放平台&#xff1a;https://api.fanyi.baidu.com/ 进入开发者信息获取 APP ID和密钥&#xff0c;并开通“通用文本翻译”服务 autMan应用市场->我的->找到“实时翻译”插件安装后去点击“配参” 二、使用示例 假如你和一个俄国人聊…

C程序设计语言精髓 单向链表

目录 单向链表---定义 单向链表---建立 单向链表---删除 单向链表---插入​ 单向链表---输出​ 单向链表---定义 单向链表---建立 单向链表---删除 单向链表---插入 单向链表---输出

Visual Studio安装图文详解教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 教程说明 本教程旨在详细介绍 Visual Studio 社区版的安装过程及其注意事项。 Visual Studio简介 Visual Studio 社区版功能完备且可扩展的免费 IDE&#xff0c;可用于创…

centos配置ssh

在CentOS上配置SSH服务主要步骤&#xff1a; 安装OpenSSH服务器&#xff1a; 首先&#xff0c;你需要确保OpenSSH服务器软件包已经安装在你的系统上。你可以使用以下命令来安装它&#xff1a; sudo yum update sudo yum install openssh-server 启动SSH服务&#xff1a; 安装完…

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力 关键词提炼 #Neurosymbolic AI #神经网络 #符号推理 #感知能力 #逻辑能力 #认知水平 #智慧与力量 第一节&#xff1a;Neurosymbolic AI的类比与核心概念 Neurosymbolic AI就像是给神经网络这位“大力士”…

如何减小 Maven 项目生成的 JAR 包体积 提升运维效率

在使用 Maven 构建 Java 项目时&#xff0c;有时需要减小生成的 JAR 包的体积&#xff0c;以提高部署效率或减少资源消耗。以下是一些有效的方法来减小 JAR 包的体积&#xff1a; 排除不必要的依赖打包时&#xff0c;依赖jar包独立于应用jar包 1. 排除不必要的依赖 通过排除项目…

【15】协方差

在Excel数据分析中,协方差是用于衡量两个变量之间的线性关系的统计量。它可以帮助你判断两个变量是否同向变化(正协方差)或反向变化(负协方差)。协方差的计算结果可以用于进一步分析变量之间的关系,尤其是在投资组合、回归分析和其他多元分析中有着广泛的应用。 1. 什么…

神策数据客户旅程 GPT:以 AI 驱动客户旅程及埋点落地

数据驱动时代&#xff0c;随着 AI 在数据处理及分析方面的能力日渐强大&#xff0c;将二者结合&#xff0c;可以帮助企业效能提升&#xff0c;获取更多商业价值。 我们在 AI 大模型探索过程中发现&#xff0c;产品经理、技术人员、市场营销人员以及需要数据驱动决策的团队&…

基于opencv的人脸闭眼识别疲劳监测

1. 项目简介 本项目旨在实现基于眼部特征的眨眼检测&#xff0c;通过监测眼睛开闭状态来计算眨眼次数&#xff0c;从而应用于疲劳监测、注意力检测等场景。使用了面部特征点检测算法&#xff0c;以及眼部特征比率&#xff08;EAR, Eye Aspect Ratio&#xff09;来判断眼睛的闭…

mysql查询id不在列表中的记录

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

C语言汇编概述

汇编语言是一种低级编程语言&#xff0c;它允许程序员直接与计算机的硬件交互。在C语言中&#xff0c;汇编语言通常用于执行特定的硬件操作、优化关键代码段以提高性能&#xff0c;或者实现C语言标准库中未提供的功能。C语言提供了内联汇编的功能&#xff0c;使得程序员可以在C…

可观测日北京|观测云:可观测性需要做到“三个一”

2024年10月&#xff0c;备受期待的中国可观测日「北京站」圆满落幕。本次活动汇聚了来自云计算、技术创新等领域的专家&#xff0c;探讨了探讨了可观测性在云计算和数字化转型中扮演的角色。观测云也在活动展示了作为可观测性行业领袖的技术力和创新力。 观测云技术亮点&#…

python画图|坐标轴显隐设置

【1】引言 前序学习中&#xff0c;已经发现坐标轴的显示具有至关重要的影响&#xff0c;因此今天继续探索相关技巧&#xff1a;坐标轴显隐设置。 前序学习内容可通过下述链接直达&#xff1a; python画图| 对齐图名和标签-CSDN博客 【2】官网教程 点击下方链接可以直达官网…

react 基础学习笔记

1.react 语法 ①数据渲染 函数组件将HTML结构直接写在函数的返回值中 JSX只能有一个根元素 JSX插值写法 插值可以使用的位置 1.标签内容&#xff1b; 2.标签属性 JSX 条件渲染&#xff1a;三目运算符&#xff1b; JSX根据数据进行列表渲染&#xff1a;map()方法&#x…

【代码随想录Day50】图论Part02

岛屿数量 深搜 题目链接/文章讲解&#xff1a;代码随想录 class Solution {// 计算网格中岛屿的数量public int numIslands(char[][] grid) {int sum 0; // 初始化岛屿数量为0// 遍历整个网格for (int i 0; i < grid.length; i) {for (int j 0; j < grid[0].length…