最小生成树 prim 算法的 js 实现

最小生成树 prim 算法的 JavaScript 实现

说明:以下示例请在较新的浏览器中查看,因为用了 class 语法。

写这篇文章的缘起

在 pcb 设计中,有一种东西叫飞线,他的生成原理主要就是使用了最小生成树算法。最小生成树是什么效果,可以看下面的例子。想知道飞线的具体应用可点击这里。工作中有用到,那必须得学习。

飞线也称跳线,是指印刷电路板上因设计缺陷、测试目的或是其他设计考量,将电路板上的两个节点直接用电线连通的一种方法。

维基百科

什么是最小生成树

如上图有 100 个点,那么连接这 100 个点的最短路径就是最小生成树,由 99 条边组成。有很多资料,我不赘述了,推荐查看参考链接。

在 codepen 看完整代码

Lazy prim

上面描述的其实是 Lazy prim,时间复杂度为 O(ElogE),运行较为耗时,改进的 prim 算法,时间复杂度可以降为 O(ElogV),其中 E 表示 edge,V 表示 vertex。如果在一个有 1000 个节点的完全稠密图,两者做一下对比,优化后的 prim 占 lazy prim 耗时的四分之一,而如果是 2000 个节点的完全稠密图,lazy prim 就更慢了。这个优化还是很有意义。

Better prim

怎么优化这个 prim 算法呢?原理说起来还真不容易,我太懒了,建议观看参考链接中的视频。或者看完整的代码:

See the Pen Better prim by zeng (@zengxiaoluan) on CodePen.

参考链接

作者: 曾小乱

喜欢写点有意思的东西

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据