当前位置:首页 > JavaScript

js实现prim

2026-01-31 20:58:49JavaScript

Prim算法简介

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}`);
}

性能优化

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

js实现prim

// 需实现优先队列结构
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实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…