第10章:堆

news2024/11/24 11:08:13

堆是什么?

  1. 堆是一种特殊的完全二叉树
    完全二叉树:每层节点都完全填满,最后一层若是没填满,则只缺少右边的节点。
  2. 所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点。
  3. javascript中通常使用数据表示堆。
  4. 左侧节点的位置是: 2 * index + 1, 右侧节点的位置: 2 * index + 2
  5. 父节点的位置:(index - 1) / 2

堆如下图:
请添加图片描述

js中的堆:
请添加图片描述

堆的应用:

  1. 高效快速的找出最大值,最小值。(时间复杂度 O(1))
  2. 找出第k个最大元素。
    请添加图片描述

实现最小堆类

  1. 在类里,声明一个数组,用来装元素。
  2. 主要方法:插入,删除堆顶,获取堆顶,获取堆的大小。

插入:将值插入堆的底部,即数组的尾部。然后上移,将这个值和它的节点进行交换,直到父节点小于等于这个插入的值。

大小为k的堆中插入元素的时间复杂度为O(logk)

class MinHeap {
      constructor() {
        // 构建的堆
        this.heap = []
      }
      // 获取父节点
      getParentIndex(i) {
        return i - 1 >> 1
      }
		// 获取左子节点
		getLeftIndex() {
			return i * 2 + 1
		}
		// 获取右子节点
		getRightIndex() {
			return i * 2 + 2
		}
      // 交换2个节点的值
      swap(i1, i2) {
        const temp = this.heap[i1]
        this.heap[i1] = this.heap[i2]
        this.heap[i2] = temp
      }
      // 插入
      insert(value) {
        this.heap.push(value)
        this.shiftUp(this.heap.length - 1)
      }
      // 上移
      shiftUp(index) {
        if (index == 0) return
        const parentIndex = this.getParentIndex(index)
        // 如果父节点的值 大于 当前节点的值
        if (this.heap[parentIndex] > this.heap[index]) {
          // 交换两个节点的值
          this.swap(parentIndex, index)
        }
      }
		
		// 删除数组的最后一个元素,并且返回
		pop() {
			this.heap[0] = this.heap.pop()
			this.shiftDown(0)
		}
		
		// 下移
		shiftDown(index) {
			const leftIndex = this.	getLeftIndex(index)
			const rightIndex = this.getRightIndex(index)
			// 左侧节点的值 < 当前节点的值
			if (this.heap[leftIndex] < this.heap[index]) {
				this.swap(leftIndex, index)
				this.shiftDown(leftIndex)
			}
			if (this.heap[rightIndex] < this.heap[index]) {
				this.swap(rightIndex, index)
				this.shiftDown(rightIndex)
			}
		}
		// 获取堆顶
		peek() {
			return this.heap[0]
		}
		// 获取堆的大小
		size() {
			return this.heap.length
		}
    }


    const h = new MinHeap()
    h.insert(3)
    h.insert(2)
    h.insert(1)
    console.log(h.heap) // [1,3, 2]

删除堆顶:

  1. 用数组尾部元素替换堆顶,(直接删除堆顶回破坏堆结构)
  2. 然后下移:将新堆顶和它的子节点进行交换,直到子节点大于等于这个新堆顶。
  3. 大小为k的堆中插入元素的时间复杂度为O(logk)

获取堆顶和堆的大小:
获取堆顶:直接返回数组的头部。
获取堆的大小:返回数组的长度。

leetCode 215.数组中的第k个最大元素

在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。
请添加图片描述

var findKthLargest = function (nums, k) {
	const h = new MinHeap()
	nums.forEach((n) => {
		h.insert(n)
		// 当堆的大小超过k,就开始删除堆顶元素
		if (h.size() > k) {
			h.pop()
		}
	})
	// 堆顶元素就是第k个最大元素
	return h.peek()
}

leetCode 347.前k个高频元素

给定一个非空的整数数组,返回其中出现频率前k高的元素。
请添加图片描述

方法1:使用字典数据结构

const topK = function (nums, k) {
	const map = new Map()
	nums.foeEach((n) => {
		// 统计每个元素出现的频率
		map.set(n, map.has(n)?map.get(n) + 1, 1)
	})
	// 降序排序
	const list = Array.from(map).sort((a, b) => b[1] - a[1])
	
	// 返回前k个元素 
	return list.slice(0, k).map(n => n[0])
}	

方法2:

const topK = function (nums, k) {
}

leetCode 23.合并k个排序链表

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

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

相关文章

软考——数据结构,算法基础,程序设计语言,法律法规,多媒体基础

数据结构与算法基础 数组与矩阵线性表广义表树与二叉树图排序与查找算法基础及常见算法 数组 稀疏矩阵 直接把&#xff08;0&#xff0c;0&#xff09;带入&#xff0c;排除B&#xff0c;C 将&#xff08;1&#xff0c;1&#xff09;带入&#xff0c;排除D&#xff0c; 最终…

Python | 人脸识别系统 — 博客索引

本博客为人脸识别系统的博客索引 工具安装、环境配置&#xff1a;Python | 人脸识别系统 — 简介 1、UI代码 UI界面设计&#xff1a;Python | 人脸识别系统 — UI界面设计UI事件处理&#xff1a;Python | 人脸识别系统 — UI事件处理 2、用户端代码 用户端博客索引&#xff1a;…

Jupyter Notebook入门教程

Jupyter Notebook&#xff08;又称Python Notebook&#xff09;是一个交互式的笔记本&#xff0c;支持运行超过40种编程语言。本文中我们将介绍Jupyter Notebook的主要特点&#xff0c;了解为什么它能成为人们创造优美的可交互式文档和教育资源的一个强大工具。 首先&#xff…

vue diff算法与虚拟dom知识整理(4) h函数虚拟节点嵌套

那么 先补充上文有一个没强调的点 h函数 当你不需要属性时 其实是可以不传的 例如 我们打开案例 打开 src下的index.js 修改代码如下 import {init,classModule,propsModule,styleModule,eventListenersModule,h,} from "snabbdom";//创建patch函数const patch ini…

CUBLAS 和 CUDNN

文章目录 一、什么是CUBLASCUBLAS实现矩阵乘法CUBLAS中的Leading DimensionCUBLAS LEVEL3函数 &#xff1a; 矩阵矩阵CUBLAS实现矩阵乘法 二、cuDNN使用CuDNN实现卷积神经网络 四、CUBLAS和CUDNN实践 一、什么是CUBLAS cuBLAS是BLAS的一个实现。BLAS是一个经典的线性代数库&am…

解决C语言的缺陷【C++】

文章目录 命名空间展开了命名空间域指定访问命名空间域域作用限定符命名空间定义 C输入&输出缺省参数全缺省参数半缺省参数缺省参数应用 函数重载参数类型不同参数个数不同参数类型顺序不同 引用引用的特性引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实…

基于Radon-分数傅里叶变换对消器的海杂波弱目标检测

海面微弱目标检测面临的主要困难来自&#xff1a; 慢速小目标回波微弱&#xff1b;空时变海杂波异常复杂&#xff0c;海杂波特性认知难度大&#xff1b;目标模型难以建立&#xff1b;目标、海杂波类别非平衡。 ARU效应 是由于海面波浪的起伏和涟漪引起的。在雷达回波信号中&am…

nodejs开发 | 安全工具端口扫描器

今天分享一个nodejs的demo&#xff0c;可以扫描出指定IP的端口开放情况。 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Google 的 V8…

[笔记]Python计算机视觉编程《一》 基本的图像操作和处理

文章目录 前言环境搭建 计算机视觉简介Python和NumPy第一章 基本的图像操作和处理1.1 PIL&#xff1a;Python图像处理类库1.1.1 转换图像格式1.1.2 创建缩略图1.1.3 复制和粘贴图像区域1.1.4 调整尺寸和旋转 1.2 Matplotlib1.2.1 绘制图像、点和线 前言 今天&#xff0c;图…

python基础实战6-python字符串

1字符串的表达方式 字符串是 Python 中最常用的数据类型。我们可以使用引号 ( 或 " ) 来创建字符串。 字符串表达方式 a " I m Tom" #一对双引号 b ’Tom said:" I am Tom" #一对单引号 c ‘Tom said: " I\m Tom" #转义字符 d T…

python库,科学计算与数据可视化基础,知识笔记(numpy+matplotlib)

文章目录 1、numpyndarray对象&#xff0c;数组指定形状创建&#xff08;要会&#xff09;数组的索引&#xff0c;切片与遍历&#xff08;要会&#xff09;数组的相加&#xff0c;转置&#xff0c;展开&#xff08;要会&#xff09;数组元素增删改查&#xff08;最好会&#xf…

当CRM遇见ChatGPT,AI如何帮销售打造“最强大脑”

导读&#xff1a;这一轮AI浪潮将对CRM企业带来哪些新机遇&#xff1f; ChatGPT诞生至今不过100多天&#xff0c;但它已经对很多行业产生了巨大影响。 企业直面市场的一线战场——销售、营销、客服等领域也是如此。以ChatGPT为代表的人工智能技术热潮正在改变着传统营销、销售的…

MySQL--group by--聚合函数--内置函数--0415 22

目录 1.聚合函数 1.1 count 1.2 sum 1.3 avg 1.4 max 和 min 2. group by 2.1 group by 的条件筛选——having 2.2 总结 3.日期函数 4.字符串函数 concat replace substring 以首字母大写&#xff0c;其余字母小写的方式显示员工的姓名 5.数学函数 format rand()…

C plus plus ——【继承与派生】

系列文章目录 C plud plus ——【面向对象编程】 C plus plus ——【继承与派生】 文章目录 系列文章目录前言一、继承1.1 类的继承1.2 继承后可访问性1.3 构造函数访问顺序1.4 子类隐藏父类的成员函数 二、重载运算符2.1重载运算符的必要性2.2重载运算的形式与规则2.3 转换运…

数字信号处理学习1

基本上算是没怎么学过数字信号处理这门课&#xff0c;因为本科的时候&#xff0c;专业方向用不上&#xff0c;现在没法子了&#xff0c;专业使然&#xff0c;只能自己自学了&#xff0c;但是我又不知道该从何学起&#xff0c;就买了一本现代数字信号处理&#xff0c;结果发现人…

数据结构/队列实现栈

前言 在学习数据结构的过程当中&#xff0c;我们会学到栈和队列&#xff0c;在本篇文章中&#xff0c;重点讲解的是队列实现栈&#xff0c;在上篇文章中已经简单介绍过栈和队列的使用说明&#xff0c;以及栈实现队列。(2条消息) 数据结构/栈实现队列_Y君的进化史的博客-CSDN博客…

吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己

吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己 主要是吴恩达的网课&#xff0c;还有部分github的prompt-engineering-for-developers项目&#xff0c;以及部分自己的经验。 一、常用使用技巧 prompt最好是英文的&#xff0c;如果是中文的prompt&am…

Day961.老城区前端改造 -遗留系统现代化实战

老城区前端改造 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于老城区前端改造的内容。 什么是“改造老城区”。改造老城区模式 是指对遗留系统内部的模块进行治理&#xff0c;让模块内部结构合理、模块之间职责清晰的一系列模式。 也就是说&#xff0c;在遗留系统…

【Redis】聊一下Redis基础架构

我们知道学习一个技术&#xff0c;最好的方式就是从全局观出发&#xff0c;然后针对不同的点进行拆分&#xff0c;一个个破解。既可以将学到的和已有的知识联系起来&#xff0c;又可以有一定的深度和目的性。 Redis基础架构 对于一个中间件来说&#xff0c;一个是使用层面&…

GO数组切片-线性数据结构

数据结构 类型 什么是类型 &#xff1f; 内存中的二进制数据本身没有什么区别&#xff0c;就是一串0或1的组合。 内存中有一个字节内容是0x63&#xff0c;他究竟是深恶 字符串?字符&#xff1f;还是整数&#xff1f; 本来0x63表示数字 但是文字必须编码成为0和1的组合 才能记…