当前位置:首页 > 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。

    js实现prim

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

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

    js实现prim

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

时间复杂度分析

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

优化建议

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

示例输出

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

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

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

标签: jsprim
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码 funct…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…