Prim算法时间复杂度为O(V²),可用优先队列优化至O(E log V);适用于稠密图,而Kruskal更适合稀疏图。

最小生成树,简单说,就是在一个加权连通图中找到一个包含所有顶点的树,且这棵树的边权重之和最小。Prim算法就是一种寻找这种树的经典算法。
解决方案:
Prim算法的核心思想是从一个初始顶点开始,逐步扩展生成树,每次都选择连接当前生成树和剩余顶点中权重最小的边。
function prim(graph) {
const numVertices = graph.length;
const visited = new Array(numVertices).fill(false); // 记录顶点是否已加入生成树
const minWeight = new Array(numVertices).fill(Infinity); // 记录每个顶点到生成树的最小权重
const parent = new Array(numVertices).fill(null); // 记录每个顶点在生成树中的父节点
// 从第一个顶点开始
minWeight[0] = 0;
parent[0] = -1; // 根节点没有父节点
for (let count = 0; count < numVertices - 1; count++) {
// 找到未访问顶点中,minWeight最小的顶点
let u = -1;
for (let v = 0; v < numVertices; v++) {
if (!visited[v] && (u === -1 || minWeight[v] < minWeight[u])) {
u = v;
}
}
if (u === -1) {
// 图不连通
return null;
}
visited[u] = true;
// 更新与u相邻的顶点的minWeight和parent
for (let v = 0; v < numVertices; v++) {
if (graph[u][v] !== 0 && !visited[v] && graph[u][v] < minWeight[v]) {
minWeight[v] = graph[u][v];
parent[v] = u;
}
}
}
// 构建最小生成树的边集合
const mst = [];
for (let i = 1; i < numVertices; i++) {
mst.push([parent[i], i, graph[i][parent[i]]]); // 存储边的起点、终点和权重
}
return mst;
}
// 示例图:邻接矩阵表示
const graph = [
[0, 2, 0, 6, 0],
[2, 0, 3, 8, 5],
[0, 3, 0, 0, 7],
[6, 8, 0, 0, 9],
[0, 5, 7, 9, 0],
];
const mst = prim(graph);
if (mst) {
console.log("最小生成树:");
let totalWeight = 0;
mst.forEach(edge => {
console.log(`${edge[0]} - ${edge[1]} : ${edge[2]}`);
totalWeight += edge[2];
});
console.log("总权重:", totalWeight);
} else {
console.log("图不连通,无法生成最小生成树。");
}Prim算法的时间复杂度是什么?如何优化?
Prim算法的基本实现(如上面的代码)时间复杂度是O(V^2),其中V是顶点数。 这是因为我们需要遍历所有未访问的顶点来找到下一个要加入生成树的顶点。
优化:可以使用优先队列(例如,二叉堆或斐波那契堆)来加速寻找最小权重的边的过程。 使用二叉堆可以将时间复杂度降低到O(E log V),其中E是边数。 使用斐波那契堆可以进一步将时间复杂度降低到O(E + V log V),这在稠密图中非常有效。
最小生成树有哪些实际应用场景?
最小生成树在现实世界中有很多应用。 比如:
Prim算法和Kruskal算法有什么区别?应该选择哪个?
Prim算法和Kruskal算法都是用于寻找最小生成树的经典算法,但它们的实现思路不同。
选择哪个算法取决于图的性质:
另外,Kruskal算法更容易并行化,因为边的选择是独立的,而Prim算法的扩展是顺序的。
以上就是最小生成树是什么?Prim算法的JS代码的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号