0

0

最小生成树是什么?Prim算法的JS代码

幻夢星雲

幻夢星雲

发布时间:2025-08-22 08:32:01

|

835人浏览过

|

来源于php中文网

原创

Prim算法时间复杂度为O(V²),可用优先队列优化至O(E log V);适用于稠密图,而Kruskal更适合稀疏图。

最小生成树是什么?prim算法的js代码

最小生成树,简单说,就是在一个加权连通图中找到一个包含所有顶点的树,且这棵树的边权重之和最小。Prim算法就是一种寻找这种树的经典算法。

解决方案:

Prim算法的核心思想是从一个初始顶点开始,逐步扩展生成树,每次都选择连接当前生成树和剩余顶点中权重最小的边。

function prim(graph) {
  const numVertices = graph.length;
  const visited = new Array(numVertices).fill(false); // 记录顶点是否已加入生成树
  const minWeight = new Array(numVertices).fill(Infinity); // 记录每个顶点到生成树的最小权重
  const parent = new Array(numVertices).fill(null); // 记录每个顶点在生成树中的父节点

  // 从第一个顶点开始
  minWeight[0] = 0;
  parent[0] = -1; // 根节点没有父节点

  for (let count = 0; count < numVertices - 1; count++) {
    // 找到未访问顶点中,minWeight最小的顶点
    let u = -1;
    for (let v = 0; v < numVertices; v++) {
      if (!visited[v] && (u === -1 || minWeight[v] < minWeight[u])) {
        u = v;
      }
    }

    if (u === -1) {
      // 图不连通
      return null;
    }

    visited[u] = true;

    // 更新与u相邻的顶点的minWeight和parent
    for (let v = 0; v < numVertices; v++) {
      if (graph[u][v] !== 0 && !visited[v] && graph[u][v] < minWeight[v]) {
        minWeight[v] = graph[u][v];
        parent[v] = u;
      }
    }
  }

  // 构建最小生成树的边集合
  const mst = [];
  for (let i = 1; i < numVertices; i++) {
    mst.push([parent[i], i, graph[i][parent[i]]]); // 存储边的起点、终点和权重
  }

  return mst;
}

// 示例图:邻接矩阵表示
const graph = [
  [0, 2, 0, 6, 0],
  [2, 0, 3, 8, 5],
  [0, 3, 0, 0, 7],
  [6, 8, 0, 0, 9],
  [0, 5, 7, 9, 0],
];

const mst = prim(graph);

if (mst) {
  console.log("最小生成树:");
  let totalWeight = 0;
  mst.forEach(edge => {
    console.log(`${edge[0]} - ${edge[1]} : ${edge[2]}`);
    totalWeight += edge[2];
  });
  console.log("总权重:", totalWeight);
} else {
  console.log("图不连通,无法生成最小生成树。");
}

Prim算法的时间复杂度是什么?如何优化?

Prim算法的基本实现(如上面的代码)时间复杂度是O(V^2),其中V是顶点数。 这是因为我们需要遍历所有未访问的顶点来找到下一个要加入生成树的顶点。

优化:可以使用优先队列(例如,二叉堆或斐波那契堆)来加速寻找最小权重的边的过程。 使用二叉堆可以将时间复杂度降低到O(E log V),其中E是边数。 使用斐波那契堆可以进一步将时间复杂度降低到O(E + V log V),这在稠密图中非常有效。

最小生成树有哪些实际应用场景?

魔法映像企业网站管理系统
魔法映像企业网站管理系统

技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作

下载

最小生成树在现实世界中有很多应用。 比如:

  • 网络设计: 在设计通信网络、电力网络、交通网络时,可以用最小生成树找到连接所有节点的最经济方案,降低建设成本。
  • 聚类分析: 最小生成树可以作为一种聚类算法的基础,通过移除树中权重较大的边,可以将图分割成多个连通分量,每个连通分量可以看作一个簇。
  • 图像分割: 在图像处理中,可以将像素点看作顶点,像素之间的相似度看作边的权重,然后使用最小生成树进行图像分割。
  • 近似算法: 最小生成树可以用于解决一些NP完全问题的近似解,比如旅行商问题(TSP)。

Prim算法和Kruskal算法有什么区别?应该选择哪个?

Prim算法和Kruskal算法都是用于寻找最小生成树的经典算法,但它们的实现思路不同。

  • Prim算法: 从一个顶点开始,逐步扩展生成树,每次都选择连接当前生成树和剩余顶点中权重最小的边。 它始终维护一棵树,直到包含所有顶点。
  • Kruskal算法: 从所有边中选择权重最小的边,如果这条边连接的两个顶点不在同一个连通分量中,则将这条边加入生成树。 它维护一个森林,逐步合并连通分量,直到只剩下一棵树。

选择哪个算法取决于图的性质:

  • 稠密图(边数接近顶点数的平方): Prim算法通常更有效,因为它的时间复杂度与边数无关(基本实现)。
  • 稀疏图(边数远小于顶点数的平方): Kruskal算法通常更有效,因为它的时间复杂度与边数相关,并且可以使用并查集进行优化。

另外,Kruskal算法更容易并行化,因为边的选择是独立的,而Prim算法的扩展是顺序的。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

390

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

257

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5274

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

477

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.04

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

40

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
550W粉丝大佬手把手从零学JavaScript
550W粉丝大佬手把手从零学JavaScript

共1课时 | 0.2万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

第二期_大前端线上班
第二期_大前端线上班

共345课时 | 45.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号