2020-12-18 js 实现堆

news/2024/7/6 5:08:29

堆是什么?

  • 堆是一种特殊的完全二叉树
  • 所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点。

js 中的堆

  • js 中通常用数组表示堆
  • 左侧子节点的位置是 2 * index + 1
  • 右侧子节点的位置是2* index + 2
  • 父节点位置是(index - 1)/ 2

堆的应用

  • 堆能高效、快速的找出最大值和最小值,时间复杂度O(1)。
  • 找出第K个最大(小)元素。

第K个最大元素

构建一个最小堆,并将元素依次插入堆中。

当堆的容量超过K,就是删除堆顶。

插入结束后,堆顶就是第K个最大元素。

JavaScript实现:最小堆类

 

实现步骤

在类里,声明一个数组,用来装元素。

主要方法: 插入、删除堆顶、获取堆顶、获取堆大小。

 

代码实现

class MianHeap {
				constructor() {
					this.heap = []
				}
				swap(i1, i2) { // 切换位置
					const temp = this.heap[i1];
					this.heap[i1] = this.heap[i2]
					this.heap[i2] = temp
				}
				getParentIndex(i) { // 找到父节点位置
					return (i - 1) >> 1; //Math.floor((i - 1 ) / 2)

				}
				getLeftIndex(i) { // 获取左节点
					return i * 2 + 1
				}
				getRightIndex(i) { // 获取有节点
					return i * 2 + 2
				}
				shiftUp(index) {
					if (index == 0) {
						return
					}
					const parentIndex = this.getParentIndex(index);
					if (this.heap[parentIndex] > this.heap[index]) {
						this.swap(parentIndex, index);
						this.shiftUp(parentIndex)
					}
				}
				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)
					}
				}
				inseter(value) {
					this.heap.push(value)
					this.shiftUp(this.heap.length - 1)
				}
				pop() {
					this.heap[0] = this.heap.pop();
					this.shiftDown(0);
				}
				peek() {
					return this.heap[0];
				}
				size() {
					return this.heap.length
				}
			}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


http://www.niftyadmin.cn/n/3655823.html

相关文章

VB实现SHELL扩展之接口参数获取失败探析

前几天有位网友问我用VB实现SHELL扩展的问题&#xff0c;这个问题比较有意思&#xff0c;虽然VB较少使用了&#xff0c;但是用VB开发COM组件还是比较方便的&#xff08;前几天用EVC开发COM组件&#xff0c;相比起来&#xff0c;用VB还是比较幸福的&#xff09;&#xff0c;所以…

js 排序学习

冒泡排序 Array.prototype.bubbleSort function() {// console.log(this)for (let i 0; i < this.length - 1; i) {for(let j 0;j<this.length -1 - i; j1){ // -1 可以用j1来获取 - i是为了缩小循环节省时间if(this[j] > this[j1]){const temp this[j] // …

16进制字符串转数字(C/C++,VB/VB.net,C#)

这个问题看是很简单&#xff0c;但是在不同语言中实现的方式却千差万别&#xff0c;如果不知道方法&#xff0c;还真是麻烦&#xff0c;我就是在C#中遇到该问题&#xff0c;让我费了很大的周折&#xff0c;才在msdn查到。一、16进制字符串转数字1、C/CI、最简单的办法&#xff…

面试题 ---快速排序的空间复杂度是多少?时间复杂度的最好最坏的情况是多少,有哪些优化方案?

Array.prototype.quickSort function() {const rec (arr) >{if(arr.length 1){return arr}// 分别存放 前后的数组const left []const right []// 设置一个基准const mid arr[0]//进行分区for(let i 1; i<arr.length; i1){if(arr[i] < mid){left.push(arr[i])}el…

如何加速XML反序列化(精简框架集2.0SP1,WinCE4.2) -- 寻求微软技术支持记

其实这个问题在2007/3/13 就提交到了微软技术支持&#xff0c;但直到今天&#xff0c;对这个问题还没有一个完美的结果&#xff08;他们最好的建议就是&#xff0c;自己解析XML文件&#xff09;&#xff0c;只好请求微软的技术支持把这个问题close掉。问题的关键在于&#xff1…

面试题---------简述 LRU 算法及其实现方式

简述 LRU 算法 一种比较常见的缓存算法&#xff0c;也是内存管理使用的一种算法。在内存满的时候&#xff0c;选择内存中最近最久未使用的页面予以淘汰。 实现方式 哈希表 双向链表 双向链表按照被使用的顺序存储了这些键值对&#xff0c;靠近头部的键值对是最近使用的&…

简述图片的懒加载原理

懒加载原理 一张图片就是一个<img>标签&#xff0c;浏览器是否发起请求图片是根据<img>的src属性&#xff0c;所以实现懒加载的关键就是&#xff0c;在图片没有进入可视区域时&#xff0c;先不给<img>的src赋值&#xff0c;这样浏览器就不会发送请求了&…