详解堆的javascript实现方法

yizhihongxing

详解堆的javascript实现方法

堆的定义

堆是一种特殊的树形数据结构,其每一个节点都有一个值,通常所表达的语义是“子节点的值都不小于(或都不大于)父节点的值”。堆可以用数组或者树形表示。堆的某个节点与其子节点之间还有一定的大小关系,因此堆又分为最大堆和最小堆。

堆的属性

  • 最大堆:对于所有节点i的值均不小于它的子节点的值,根节点为最大值;
  • 最小堆:对于所有节点i的值均不大于它的子节点的值,根节点为最小值。

堆的常见操作

  • 插入
  • 删除堆顶元素
  • 堆排序
  • 调整节点位置
  • 堆的建立

堆的javascript实现方法

将堆转化为数组表示,定义如下:

[1,2,3,4,5,6,7]

插入节点

将节点插入到数组末尾:

var heap = [1,2,3,4,5,6,7];
heap.push(8);

为了保持堆的属性,需要调整节点位置:

function adjustHeap(heap) {
  for(var i=Math.floor((heap.length-1)/2); i>=0; i--) {
    adjustNode(heap, i, heap.length);
  }
  return heap;
}

function adjustNode(heap, index, length){
  var left = index*2 + 1, right = index*2 + 2;
  var maxIndex = index;
  if(left < length && heap[left] > heap[maxIndex]) {
    maxIndex = left;
  }
  if(right < length && heap[right] > heap[maxIndex]) {
    maxIndex = right;
  }
  if(maxIndex !== index) {
    swap(heap, maxIndex, index);
    adjustNode(heap, maxIndex, length);
  }
}

function swap(heap, i, j){
  var temp = heap[i];
  heap[i] = heap[j];
  heap[j] = temp;
}

console.log(adjustHeap(heap));
// [8, 5, 7, 4, 2, 6, 3, 1]

删除堆顶元素

将堆顶元素和数组末尾的元素交换,然后弹出末尾元素,最后调整堆:

function removeMax(heap){
  var max = heap[0];
  heap[0] = heap[heap.length - 1];
  heap.pop();
  adjustHeap(heap);
  return max;
}

console.log(removeMax(heap)); // 8
console.log(heap); // [7, 5, 6, 4, 2, 3, 1]

示例说明

假设有一个数组[2,1,5,4,3],将它转化为堆:

var heap = [2,1,5,4,3];
console.log(adjustHeap(heap)); // [5, 4, 2, 1, 3]

删除堆顶元素,并将剩余元素重新调整为堆:

console.log(removeMax(heap)); // 5
console.log(adjustHeap(heap)); // [4, 3, 2, 1]

以上就是堆的javascript实现方法的详解攻略,希望对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解堆的javascript实现方法 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 一文带你简单封装JS下的异步任务对象

    下面是关于“一文带你简单封装JS下的异步任务对象”的完整攻略。 前言 异步编程到现在已经是一个非常成熟的概念,并且也是前端开发中非常重要的一环。在JavaScript中,常见的异步操作包括网络请求、读写文件等。但是在异步操作中,由于异步事件的不确定性,使得相关代码比同步代码更难以理解、调试以及维护。为了更优雅地解决这个问题,我们可以使用异步任务对象的方式来封…

    JavaScript 2023年6月10日
    00
  • 详解Javascript中DOM的范围

    详解Javascript中DOM的范围 什么是DOM范围 在Javascript中,DOM(Document Object Model)是指用来描述HTML文档结构的树形结构模型。而DOM范围则是指在Javascript中,我们可以对DOM树进行操作的范围。 一个DOM范围由以下几个组成部分: 起始边界点(start boundary point):范围的开…

    JavaScript 2023年6月10日
    00
  • JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码

    获取本月第几周、本月共几周、本月有多少天 首先,我们可以使用Date对象来获取当天的日期。通过获取当前日期的月份和年份,可以计算出本月有多少天。同时,我们可以使用getDay()方法来获取当前日期是星期几,然后在计算出本月的第几周以及本月共几周。 下面是获取本月第几周、本月共几周和本月有多少天的示例代码: // 获取当前日期 const date = new…

    JavaScript 2023年6月10日
    00
  • 微信小程序开发入门基础教程

    微信小程序开发入门基础教程 前言 微信小程序是一种全新的应用形态,可以在微信中打开,使用前端技术进行开发。相比传统APP而言,微信小程序不需要安装,用户可以直接通过微信扫描二维码或者搜索来使用。本文将从基础入门开始,介绍微信小程序的开发过程。 准备工作 在开始微信小程序开发之前,需要准备好以下环境:1. 微信开发者工具,可以在这里下载。2. 微信公众平台账号…

    JavaScript 2023年5月27日
    00
  • javascript常用功能汇总

    JavaScript常用功能汇总 JavaScript (简写为JS) 是一种轻量级的编程语言。它是Web前端开发的三大基石之一(HTML、CSS、JavaScript)。本文将介绍一些常用的JavaScript功能,包括字符串操作、数组操作、函数定义等。 字符串处理 JavaScript中的字符串是用单引号或双引号括起来的文本。常用的字符串操作包括:查找子…

    JavaScript 2023年5月18日
    00
  • js停止输出代码

    如果想要在JavaScript中停止当前代码的执行,可以使用以下几种方法: 1. 使用throw语句抛出错误 使用throw语句可以抛出一个自定义的错误,从而终止代码执行。示例代码如下: function divide(a, b) { if (b === 0) { throw new Error(‘除数不能为0!’); } return a / b; } t…

    JavaScript 2023年5月28日
    00
  • 正则表达式regular expression详述(一)

    正则表达式regular expression详述 什么是正则表达式? 正则表达式(Regular Expression),简称为正则(Regex或RegExp),是一种用于描述文本匹配规则的工具。它使用单个字符串来描述、匹配和替换一系列符合某个规则的字符串。 使用正则表达式可以极大地方便文本处理,例如数据的清洗、格式检验、搜索、替换、语法分析等。正则表达式…

    JavaScript 2023年6月10日
    00
  • Vue3 跨域配置devServer的参数和设置方法

    Vue3 是一款流行的前端框架,它允许我们在开发中使用各种功能强大的功能,其中包括跨域请求。在本篇文章中,我将为您讲解如何在 Vue3 项目中配置 devServer 实现跨域请求。 什么是跨域请求? 在 Web 开发中,域指的是通过互联网来唯一标识一个网络资源的字符串。跨域请求则是指在客户端浏览器向服务器发起请求时,所请求的资源的域名与当前网页的域名不同,…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部