详解堆的javascript实现方法

详解堆的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日

相关文章

  • Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    JQuery是一种JavaScript库,其中包括了许多有用的工具方法,其中包括四种数据请求方法:$.get(), $.post(), $.ajax(), $.getJSON()。以下是它们的详细讲解: $.get(url, data, success, dataType) url:请求的URL地址 data:发送给服务器的数据(可以省略) success:…

    JavaScript 2023年5月19日
    00
  • JavaScript字符串转数字的简单实现方法

    为了方便讲解,我们先简要介绍一下 JavaScript 中的数字和字符串数据类型。 JavaScript 中的数字(Number)类型可以直接进行算术运算,而字符串(String)类型则是由一系列字符组成的序列,不能直接进行算术运算。在实际开发过程中,我们常常需要将字符串类型转换为数字类型,以便进行计算或比较。 那么,下面就来介绍一下 JavaScript …

    JavaScript 2023年5月28日
    00
  • 微信小程序的部署方法步骤

    当您准备好为您或您的客户构建微信小程序时,下一步是部署它。以下是微信小程序的部署方法步骤的完整攻略: 1. 注册小程序帐号 首先,在 微信公众平台 上注册一个小程序帐号。按照提示填写信息并完成注册流程。 2. 开发小程序代码 您可以使用 微信官方开发工具 开始创建和构建小程序。请按照教程进行设置和创建小程序代码。 3. 添加小程序版本 在微信小程序开发者工具…

    JavaScript 2023年6月10日
    00
  • 几句话带你理解JS中的this、闭包、原型链

    下面我将为你详细讲解“几句话带你理解JS中的this、闭包、原型链”的完整攻略。 this 在Javascript中,this关键字代表函数执行时的上下文环境,它的值取决于函数被调用时的方式。如果函数是作为对象的方法被调用,this指向该对象,如果函数作为普通函数被调用,this指向全局对象window。 在ES6中,箭头函数使用词法作用域,且绑定了外层函数…

    JavaScript 2023年6月10日
    00
  • Javascript RegExp test() 方法

    JavaScript RegExp的test()方法 JavaScript的RegExp对象中的test()方法是一个布尔值,用于检查一个字符串是否匹配正则表达式。如果匹配,返回true否则false。 语法 test()方法的语法如下: .test(str) 其中,str是要检查的字符串。 示例1:使用test()检查字符串是否匹配正则表达式 const …

    JavaScript 2023年5月11日
    00
  • Vuex的各个模块封装的实现

    Vuex是Vue.js的官方状态管理库。它通过对状态的集中式管理来解决组件之间共享状态管理的问题,让我们可以更好地组织代码和管理状态。Vuex中的各个模块都有特定的功能和职责,本文介绍了各个模块的封装的实现方式。 状态(State) 在Vuex中,状态是存储在store中的数据,我们一般将所有的状态都放在一个对象里。要访问状态信息,需要使用getter(可理…

    JavaScript 2023年6月11日
    00
  • 详细解密jsonp跨域请求

    关于“详细解密jsonp跨域请求”的攻略,包含了如下几个步骤: 1. 什么是JSONP跨域请求 JSONP(JSON with Padding)是一种解决跨域资源共享的方法。它通过在页面的头部加上一个脚本(script)标签,并通过这个标签的src属性向另一个域名发出请求,另一个域名在返回的响应中放入一些JavaScript代码。返回的JavaScript代…

    JavaScript 2023年5月27日
    00
  • JavaScript获取当前时间向前推三个月的方法示例

    获取当前时间向前推三个月可以使用JavaScript中的Date对象和相关方法来实现。下面是具体的攻略: 获取当前时间 使用JavaScript中的Date对象可以获取当前的时间。代码如下: var currentTime = new Date(); console.log(currentTime); 输出结果如下: Sun Jul 11 2021 15:4…

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