当前位置:首页 > JavaScript

js实现prim

2026-01-31 20:58:49JavaScript

Prim算法简介

Prim算法是一种用于求解加权无向图最小生成树的贪心算法。该算法从任意一个顶点开始,逐步扩展生成树,每次选择连接生成树与非生成树顶点的最小权重边。

js实现prim

实现步骤

初始化图数据结构 使用邻接表表示图,每个顶点存储其相邻顶点及边的权重:

js实现prim

class Graph {
  constructor(vertices) {
    this.V = vertices;
    this.adj = new Map();
  }
  addEdge(u, v, w) {
    if (!this.adj.has(u)) this.adj.set(u, []);
    this.adj.get(u).push({ node: v, weight: w });
    if (!this.adj.has(v)) this.adj.set(v, []);
    this.adj.get(v).push({ node: u, weight: w });
  }
}

核心算法实现

function primMST(graph) {
  const parent = new Array(graph.V).fill(-1);
  const key = new Array(graph.V).fill(Infinity);
  const inMST = new Array(graph.V).fill(false);
  key[0] = 0;

  for (let count = 0; count < graph.V - 1; count++) {
    const u = minKey(key, inMST);
    inMST[u] = true;

    for (const { node: v, weight } of graph.adj.get(u)) {
      if (!inMST[v] && weight < key[v]) {
        parent[v] = u;
        key[v] = weight;
      }
    }
  }
  return { parent, key };
}

function minKey(key, inMST) {
  let min = Infinity, minIndex = -1;
  for (let v = 0; v < key.length; v++) {
    if (!inMST[v] && key[v] < min) {
      min = key[v];
      minIndex = v;
    }
  }
  return minIndex;
}

使用示例

const g = new Graph(5);
g.addEdge(0, 1, 2);
g.addEdge(0, 3, 6);
g.addEdge(1, 2, 3);
g.addEdge(1, 3, 8);
g.addEdge(1, 4, 5);
g.addEdge(2, 4, 7);
g.addEdge(3, 4, 9);

const { parent } = primMST(g);
for (let i = 1; i < g.V; i++) {
  console.log(`${parent[i]} - ${i}`);
}

性能优化

对于稀疏图,建议使用优先队列(最小堆)优化查找最小边的过程:

// 需实现优先队列结构
function optimizedPrim(graph) {
  const parent = new Array(graph.V).fill(-1);
  const key = new Array(graph.V).fill(Infinity);
  const heap = new PriorityQueue((a, b) => a.key - b.key);
  heap.push({ vertex: 0, key: 0 });
  key[0] = 0;

  while (!heap.isEmpty()) {
    const { vertex: u } = heap.pop();
    for (const { node: v, weight } of graph.adj.get(u)) {
      if (weight < key[v]) {
        key[v] = weight;
        parent[v] = u;
        heap.push({ vertex: v, key: key[v] });
      }
    }
  }
  return parent;
}

复杂度分析

  • 基础实现时间复杂度:O(V²)
  • 优先队列优化后时间复杂度:O(E log V)
  • 空间复杂度均为:O(V + E)

标签: jsprim
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const rando…