1. 最小生成树(Minimum Spanning Tree, MST)经典的算法如Prim算法和Kruskal算法
2. 分布式系统下的MST算法,经典的是 R. G. Gallager, P. A. Humblet 和P. M. Spira提出的GHS算法
- The Original paper by Gallager, Humblet and Spira from 1983.
- The enhanced version of the original prepared by Guy Flysher and Amir Rubinshtein. (I recommend this one)
- If F is a fragment of an MST M, then joining the node of the other end of the minimum weight "outgoing" edge will yield yet another fragment of M. Here, "outgoing" is defined as an edge which connects (any node in) the fragment to a node that is not part of the fragment.
- 假设F是最小生成树M的一个片断,连接最小权重“出边”的另一端结点,得到一个新的片断。这里的出边指的是连接非片断中的结点到非片断结点的边。
1)保持片断集合,满足所有片断的并集包括所有节点;
2)初始时,集合中包含的每个节点是由一个节点组成的片断;
3)通过片断中节点找出片断的最小带权出边;
4)当已知片断的最小带权出边时,通过增加出边,将片断之间连接过来;
5)当只剩一个片断时,算法终止。
GHS算法详细步骤如下:1)初始化所有的片断的level=0,仅包含1个结点,所有结点状态Sleeping;
2)结点在做任何事之前需要wake up,GHS算法对于每个wakeup的进程没有任务限制,如果需要,可以一次唤醒所有结点或者一次唤醒一个结点,算法最终所有的结点最终均被唤醒;
3)每个片断查找最小权重的出边并发送一个连接请求给同一level下的片断;
4)每次片断给片断发送连接请求时,片断进入“waiting”状态,等待至到片断absorbed(吸收)或跟其他的片断merge(融合);
5)当一个片断接收到连接请求时,决定其与请求的片断是absorbed还是merge的条件如下:
- 如果接收到连接请求的片断level低于它,则立即absorbed
- 如果接收到连接请求的片断level等于或高于它,则有两种选择:
- 如果接收连接的片断同样给发送了连接请求给其他片断,则merge
- 如果是其他情况,片断没有回复,等待状态改变。一旦算法工作,立即进行merge或absorb
7)最后,需要注意两件事情:
- level-1及以上的片断被一对结点控制,称作core node,这些结点是在level-0交换连接请求时形成的
- core node之间边的权重可以用来标识片断,因为GHS算法中所有边是惟一的,边的权重可以用来惟一标识片断。
本文参考:
Distributed-Graph-Algorithms Minimum-Spanning-Tree