第一次尝试
可以很简单的做出一个能发现最小生成树的算法。
函数MST(
G,
W)
:
T = {}
当T没有形成生成树时:
在E中 找到对T安全的最小加权边 T =
T union {(
u,
v)}
return T 在这种情况下,"安全"意味着包括边缘不会在图中形成一个循环。循环意味着从一个顶点开始,到其他一些顶点,最后再回到起点,而不会两次使用同一条边。
历程
捷克科学家奥塔卡-博鲁夫卡在1926年开发了第一个已知的寻找最小生成树的算法。他想解决寻找摩拉维亚地区用电的有效覆盖问题。今天,这个算法被称为博鲁夫卡算法。今天常用的还有两种算法。其中一种是1930年由Vojtěch Jarník提出的,1957年由Robert Clay Prim付诸实践。Edsger Wybe Dijkstra在1959年重新发现了它,并称之为Prim算法。另一种算法叫做Kruskal算法,由Joseph Kruskal在1956年发表。这三种算法都是贪婪的,并且在多项式时间内运行。
迄今为止最快的最小生成树算法是由Bernard Chazelle开发的。该算法基于软堆,是一种近似的优先级队列。其运行时间为O(m α(m,n)),其中m是边的数量,n是顶点的数量,α是Ackermann函数的经典函数倒数。函数α的增长速度极慢,因此,出于所有实际目的,它可以被认为是一个不大于4的常数;因此,Chazelle的算法需要非常接近线性的时间。
这个问题的最快算法是什么?这是计算机科学中最古老的未决问题之一。显然有一个线性的下限,因为我们至少必须检查所有的权重。如果边缘权重是整数,且位长有界,那么已知确定性算法,运行时间为线性。对于一般的权重,有随机化算法,其预期运行时间是线性的。
这个问题也可以用分布式的方式来解决。如果把每个节点看作是一台计算机,除了自己的连接链路外,没有一个节点知道任何东西,那么仍然可以计算出分布式最小生成树。