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

相关文章

  • Js基础学习资料

    Js基础学习资料完整攻略 目录 学习网站推荐 学习书籍推荐 个人建议 学习网站推荐 以下是一些适合 Js 初学者的网站,这些网站通常包括了从 Js 基础语法到高阶应用的全面内容。 MDN Web Docs w3schools JavaScript.info 学习书籍推荐 以下是一些 Js 学习者可以选择的经典书籍。 《JavaScript 高级程序设计》([…

    JavaScript 2023年5月18日
    00
  • 一些常用的JS功能函数(2009-06-04更新)

    一些常用的JS功能函数是一篇介绍常用JS函数的文章,内容涵盖了字符串操作、数组操作、日期操作、基本算法等方面。本文将结合实例进行详细讲解。 字符串操作函数 字符串去首尾空格函数 trim() 这个函数可以去除字符串头尾的空格,使得字符串更加统一。 示例: let str = ‘ hello world! ‘; str = str.trim(); consol…

    JavaScript 2023年5月18日
    00
  • 轻量级javascript 框架Backbone使用指南

    轻量级javascript 框架Backbone使用指南 1. Backbone概述 Backbone是一个轻量级的javascript框架,可用于开发单页Web应用程序。它提供了一组处理网页数据和用户界面的关键组件,包括Models、Views、Collections和Routers。使用Backbone,开发者可以将应用程序中的业务逻辑分解为一个个可重用…

    JavaScript 2023年6月11日
    00
  • 静态页面利用JS读取cookies记住用户信息

    静态页面读取cookie的基本原理 在使用JavaScript读取cookie之前,我们需要先了解什么是cookie。Cookie是指客户端保存在浏览器中的一小段文本数据,由Web服务器生成并存储在用户计算机上,当下次用户访问相同的站点时,服务器可读取此cookie的值,来判断用户是否合法,以及是否登录过等。 读取cookie需要使用JavaScript中的…

    JavaScript 2023年6月11日
    00
  • 一文了解JavaScript闭包函数

    一文了解JavaScript闭包函数 JavaScript中的闭包函数是一种常见的概念,尤其常用于前端开发中。本文将对闭包函数进行详细讲解,帮助更好地理解它的概念和使用方法。 什么是JavaScript闭包函数? 在了解什么是闭包函数之前,我们先要了解嵌套函数的概念。在JavaScript中,我们可以在一个函数内部定义另一个函数,这个内部函数就是嵌套函数。 …

    JavaScript 2023年5月27日
    00
  • 利用BootStrap的Carousel.js实现轮播图动画效果

    以下是“利用BootStrap的Carousel.js实现轮播图动画效果”的完整攻略。 步骤一:引入Bootstrap和JQuery库 <!– 引入Bootstrap样式 –> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.…

    JavaScript 2023年6月11日
    00
  • JS正则表达式验证中文字符

    当我们在开发Web应用时,经常需要验证用户输入的数据是否符合规则。JS正则表达式可以轻松地完成数据验证的任务。其中,验证中文字符是很常见的需求之一。下面,我们来详细讲解JS正则表达式验证中文字符的完整攻略。 1. JS正则表达式的基础 JS正则表达式是用于匹配字符串中字符组成模式的表达式。它通过一系列特定的字符和符号定义匹配规则。下面是一些常用的JS正则表达…

    JavaScript 2023年5月19日
    00
  • Javascript Worker子线程代码实例

    Javascript Worker子线程代码实例完整攻略 在前端开发中,为了避免一些复杂的计算或者耗时操作影响到UI的性能,我们可以使用Web Worker来创建一个新的线程来执行这些计算。 Worker的特点 Web Worker是一种实现了多线程的JavaScript。它可以使得浏览器在后台运行独立的脚本线程,将一些需要较长时间才能运行完成的任务交给这些…

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