当前位置:首页 > JavaScript

js实现prim

2026-04-05 13:15:12JavaScript

Prim算法实现(JavaScript)

Prim算法是一种用于求解加权无向图最小生成树的贪心算法。以下为JavaScript实现示例:

class Graph {
  constructor(vertices) {
    this.V = vertices;
    this.graph = Array(vertices).fill().map(() => Array(vertices).fill(0));
  }

  addEdge(u, v, weight) {
    this.graph[u][v] = weight;
    this.graph[v][u] = weight;
  }

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

  primMST() {
    const parent = new Array(this.V).fill(-1);
    const key = new Array(this.V).fill(Infinity);
    const mstSet = new Array(this.V).fill(false);

    key[0] = 0;
    parent[0] = -1;

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

      for (let v = 0; v < this.V; v++) {
        if (this.graph[u][v] && !mstSet[v] && this.graph[u][v] < key[v]) {
          parent[v] = u;
          key[v] = this.graph[u][v];
        }
      }
    }

    this.printMST(parent);
  }

  printMST(parent) {
    console.log("Edge \tWeight");
    for (let i = 1; i < this.V; i++) {
      console.log(`${parent[i]} - ${i} \t${this.graph[i][parent[i]]}`);
    }
  }
}

// 使用示例
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);
g.primMST();

算法核心逻辑

  1. 初始化:创建key数组存储顶点权重,mstSet数组记录顶点是否包含在MST中,parent数组存储MST结构。

  2. 选择起始点:将第一个顶点作为起始点,设置key值为0。

  3. 循环处理:每次从未处理的顶点中选择key值最小的顶点加入MST集合。

  4. 更新相邻顶点:对于新加入顶点的所有相邻顶点,更新其key值和父节点。

  5. 输出结果:最终parent数组记录了最小生成树的边关系。

时间复杂度分析

该实现使用邻接矩阵表示图,时间复杂度为O(V²)。对于稀疏图,可以使用优先队列优化至O(E log V)。

优化建议

  1. 使用邻接表替代邻接矩阵存储稀疏图
  2. 实现优先队列(最小堆)来优化minKey操作
  3. 添加输入验证和错误处理机制
  4. 支持从文件或用户输入读取图数据

示例输出

对于上述测试图,输出结果将显示最小生成树的边及其权重:

js实现prim

Edge    Weight
0 - 1   2
1 - 2   3
0 - 3   6
1 - 4   5

该输出表示最小生成树总权重为2+3+6+5=16。

标签: jsprim
分享给朋友:

相关文章

js实现二叉树

js实现二叉树

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

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…

js 实现图片轮播

js 实现图片轮播

基础实现方案 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS负责样式布局,JavaScript处理轮播逻辑。 <div class="…

js 实现验证码

js 实现验证码

实现验证码的 JavaScript 方法 生成随机验证码 验证码通常由随机字符(数字、字母或混合)组成。以下代码生成一个 6 位随机验证码(数字和字母混合): function generateCa…