当前位置:首页 > 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实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js钟表实现

js钟表实现

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

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js实现按钮点击

js实现按钮点击

实现按钮点击的JavaScript方法 HTML按钮元素 在HTML中创建按钮元素,为其添加id或class以便JavaScript选择: <button id="myButton">点…