分布式最小生成树算法

分布式最小生成树算法

作为分布式算法中的经典算法之一,GHS分布式最小生成树算法的相关资料却并不多见,相关的原理介绍只是范范而谈,代码实现也比较少见。本文将汇总目前网络上可查阅的相关参考资料并结合自己的理解,旨在深入理解GHS的算法核心与实现细节

介绍

最小生成树

给定一个加权图 G = ( V , E ) G=(V,E) G=(V,E),产生一个生成树 T = ( V , E ′ ) T=(V,E') T=(V,E) 使得所有边的权重和最小

可应用于城市中的光缆布局,欧几里得平面内的旅行商问题(这是一个经典NP-hard问题)等等相关问题

在这里插入图片描述

注意:如果每个边的权重值不同,那么MST是唯一的

稀疏与稠密

稠密表示

具有权重边以及n个点的图 G = ( V , E ) G=(V,E) G=(V,E)可以使用不同的数据结构进行表示。其中,邻接矩阵是一个大小为 ∣ V ∣ × ∣ V ∣ |V|×|V| V×V的矩阵,矩阵中的元素为 w ( u , v ) w(u,v) w(u,v)(其中 u u u 表示索引行, v v v 表示索引列)。其表示与 ∣ V ∣ 2 |V|^2 V2成正比,与 ∣ E ∣ |E| E 无关,我们称其为稠密表示

稠密图与稀疏图

有很少条边(边的条数 ∣ E ∣ |E| E接近要连接的图的最小边数 ∣ E ∣ = O ( ∣ V ∣ ) |E|=O(|V|) E=O(V))的图称为稀疏图(sparse graph),反之边的条数 ∣ E ∣ |E| E接近 ∣ V ∣ 2 |V|^2 V2,称为稠密图(dense graph)

Prim算法

两种经典MST单机算法之一。算法的每一步都会为生长中的树添加一条边,该树最开始只有一个顶点,然后会添加 V − 1 V-1 V1 个边,每次添加的是外围具有最小权重的边。

Kruskal算法

按照边的权重顺序(从小到大)将边加入生成树中,但是若加入该边会使其与生成树形成环则不加入。直到树中含有 V − 1 V-1 V1 条边为止,这些边组成的就是该图的最小生成树。

目前,既不能证明不存在能在线性时间内得到任意图的最小生成树的算法,也未能发明能够在线性时间内计算稀疏图的最小生成树的算法。

分布式最小生成树算法

其中最经典的便是GHS算法(分布式版本下的Prim算法),MST通过以片段的最小权重边相互联合完成构造。

image-20230203184358213

汇聚传输(Convergecast)

这个类似于广播,但是唯一不同的是发送信息的节点变成了收到信息的节点。在广播时,一个节点要向所有节点发送消息,但汇聚传输变成了所有节点要向某一节点发消息,也就是这个节点要汇聚其他节点发送的消息。一个最简单的汇聚传输算法便是echo算法,一个叶子结点发送一个消息给他的父节点,如果一个内部节点(非叶子结点)从他所有的子节点收到了消息,那么他将会把这个消息发送给他的父节点。这个算法很简单,但是其实限制非常多,所以我们需要用到其他方式来辅助实现。通常回波算法与泛洪算法配对,泛洪算法用来让叶子知道它们应该开始回波过程,这被称为泛洪/回声。

GHS算法过程

前提假设

  • 输入图是连通且无向的
  • 输入图中的每条边都有不同的有限权重。(如果增加相应的唯一性处理,则不需要此假设)
  • 每个节点最初都知道其连接的每条边的权重
  • 在初始状态下,每个节点都处于非活动状态。每个音符要么自发唤醒,要么被从另一个节点接收到的任何消息唤醒
  • 消息可以在边缘的两个方向上独立传输,并在未知但有限的延迟后到达,不会出现通信错误
  • 每个边以FIFO(先进先出)顺序传送消息

状态

一旦被标记为Branch或者Rejected将不可再被改变

  • Basic(初始状态)
  • Branch(MST边)
  • Rejected(非MST边)
点变量
  • 点状态(SN)
    • Found
    • Sleeping
    • Find
  • Find-count
  • Level:片段等级
  • FN
  • in-branch
  • best-edge
  • best-wt

主体循环

其算法以片段为核心,我们从整个片段的角度思考

  • 区分出片段中的出边,并决断出片段中的最小权重出边,记为最小生成树的一条边(对应伪代码5,6,7,8,9,10,11,12)
  • 联合过程:发送合并/吸收请求或者相应合并/吸收请求(对应伪代码3)
  • 更新同步信息(对应伪代码4)

循环上述过程直到没有外出边,各个步骤具体介绍见下

片段内部处理

问题1:在一个片段内我们如何确定用于向外连接的那些边呢?

我们通过引入根节点(root node)并结合消息广播与汇聚传输来解决这个问题。

问题2:以0根节点为例,我们如何使得选择的是权重为8的边而非4呢?

在扩增之前我们先同片段内的节点以相同的标识(name)

image-20230203192756366
问题3:那寻找外出边的具体过程是什么呢?

通过测试过程(test),每个节点通过向邻边发送test消息,接受的节点回复accept或者reject

根节点通过广播初始化其片段,并使用汇聚传输从片段中的节点收集符合条件边的report信息,从而确定出最佳出边

image-20230203195357835
问题4:accept或者reject判断的具体过程是什么?

节点 i 向节点 j 发送test消息

  • 如果name(i) = name(j),发送reject(意味着同片段)
  • 如果name(i) ≠ name(j)
    • level(i)≤level(j),节点 j 发送accept
    • level(i)>level(j),节点开始等待直至level(i)=level(j),然后发送accept或者reject消息(具体见下Test后置)

联合过程

  • 每一个片段都有等级(level),片段初始化等级为0
  • 合并:两个同为L等级的片段合并形成一个L+1等级的片段
  • 吸收:L 等级的片段被 L‘ 等级的片段吸收,新片段等级为 L’(L<L’)

由上述可知,片段的level只能单向增加并且每一个 L 等级的片段有至少 2 L 2^L 2L 个点

合并(Merge)

联合(join)消息被交换之后,改变点状态为Branch,然后新的根节点广播 ( i n i t i a t e , L + 1 , n a m e ) (initiate,L+1,name) (initiate,L+1,name) 信息来同步片段内所有节点

吸收(Absorb)

T发送一个联合(join)信息给T’(L<L’),收到初始化消息完成吸收过程。结合上述片段内部处理过程,我们不难发现其低片段节点会优先完成聚合决策,也就是说片段只会接收到来自同级或者低级发送的Connect消息。

具体案例分析

抽象描述

image-20230205194331579

image-20230205194456737

例一

本部分从最简单的图开始,逐步增加复杂度来深入理解算法流程

image-20230302192741672
2
100000 206 
206 100000 
[0.000000] 1(name=0, level=0) initalization
[0.000000] 0(name=0, level=0) initalization
[0.000031] 0(name=0, level=0) sending connect to 1 with level=0
[0.000152] 1(name=0, level=0) sending connect to 0 with level=0
[0.000240] 1(name=0 level=0) received connect from 0 with level=0
[0.000197] 0(name=0 level=0) received connect from 1 with level=0
[0.000221] 0(name=0 level=0) sending initiate to 1 with level=1, name=206, state=1
[0.000379] 1(name=0 level=0) sending initiate to 0 with level=1, name=206, state=1
[0.000407] 1(name=0 level=0) received initate from 0 with level=1 name=206 state=1
[0.000342] 0(name=0 level=0) received initate from 1 with level=1 name=206 state=1
[0.000363] 0(name=206 level=1) sending report to 1 with bestWt=100000
[0.000472] 1(name=206 level=1) sending report to 0 with bestWt=100000
[0.000494] 1(name=206 level=1) received report from 0 with weight=100000
[0.000428] 0(name=206 level=1) received report from 1 with weight=100000
[0.000465] 0(name=206 level=1) sending terminate to q=1
MST: 0 1 206
[0.000600] 1(name=206 level=1) sending terminate to q=0

0 唤醒,寻找其最小边(此处为1),向其发送连接请求消息,

1 唤醒,寻找其最小边(此处为0),向其发送连接请求消息,

1 接收到 0 的连接消息,回应 0 的连接请求(回复其初始化信息)

0 接收到 1 的连接消息,回应 1 的连接请求(回复其初始化信息)

0 接收到 1的初始化信息完成初始化进入 Test 过程

1 接收到 0 的初始化信息完成初始化进入 Test 过程

0 Test 过程由于没有其他边直接进入Report过程(向 1 发送 report 信息)

1 Test 过程由于没有其他边直接进入Report过程(向 0 发送 report 信息)

完成之后两点终止,算法结束

例二

image-20230302193936136
3
100000 412 572 
412 100000 100000 
572 100000 100000

0 唤醒,寻找其最小边(此处为1),向其发送连接请求消息

1 唤醒,寻找其最小边(此处为0),向其发送连接请求消息

1 接收到 0 的连接消息,回应 0 的连接请求(回复其初始化信息,level=1, name=412, state=1)

0 接收到 1 的连接消息,回应 1 的连接请求(回复其初始化信息, level=1, name=412, state=1)

0 接收到 1 的初始化信息,完成初始化,进入 Test 过程( 向 2 发送Test信息 )

1 接收到 0 的初始化信息,完成初始化,进入 Test 过程,由于没有其他边直接进入Report过程(向 0 发送 report 信息)

0 等待 2 的 report

2 初始化, 寻找其最小边(此处为0),向其发送连接请求消息

0 接收到 2 的连接消息,回应 2 的连接请求(回复其初始化信息, level=1, name=412, state=1)

2 接收到 1 的 test 消息,等待测试

2 接收到 0 的初始化信息,完成初始化

2 向 0 发送 reject 消息(此时0与2已经是一个片段了因此是reject)

0 向 1 发送 report ,结束算法过程

例三

img
4
100000 100000 282 100000 
100000 100000 467 100000 
282 467 100000 688 
100000 100000 688 100000 

开启 0 1 2 3 点进程

0 唤醒,寻找其最小边(此处为2),向其发送连接请求消息

1 唤醒,寻找其最小边(此处为2),向其发送连接请求消息,

2 唤醒,寻找其最小边(此处为0),向其发送连接请求消息,

3 唤醒,寻找其最小边(此处为2),向其发送连接请求消息,

0 接收到 2 的连接消息(回应 2 的连接请求,回复其初始化信息 level=1, name=282, state=1)

2 接收到 0 的连接消息(回应 0 的连接请求,回复其初始化信息 level=1, name=282, state=1)

0 接收到 2 的初始化信息,进入 Test 过程,没有其他节点直接向 2 进行 report

2 接收到 1 的连接消息,进入连接等待状态

2 接收到 3 的连接消息,仍然处于连接等待状态

2 接收到 0 的初始化信息,进入Test 过程(向 1 发送 Test 消息)并继续等待与连接

1 接收到 2 的 Test 消息,并进入 Test 等待(该消息后置)

2 回复 3 初始化信息 level=1, name=282, state=1

2 接收到 0 的 report 信息

3 接收到 2 的初始化消息,没有其他节点直接向 2 进行 report

2 回复 1 初始化信息 level=1, name=282, state=1,并等待 report

2 接收到 3 的 report 信息

1 接收到 2 的初始化消息,没有其他节点直接向 2 进行 report

1 向 2 发送 reject 消息(此时1与2为同片段)

2 向 0 发送 report消息,算法结束

问题

如何理解其中的几个后置消息?

结合源论文中的算法我们可以发现其中有三处出现了"place received message on end of queue"

  • 连接后置:结合下述伪代码,如果L=LN(即发送连接消息的片段等级等于接收连接消息的片段等级)且边状态是Basic,则后置连接消息。我们结果例三具体说明。从 2 的视角来看,其最小边为 2-0 因此在初始化阶段将其赋值为 1,而当1,3发送连接消息时,由于此时2还没有完成与0的连接,其片段等级仍然为 0 与1,3相同并且其 2-1 与 2-3 边状态均为 0,所以1与3的连接消息进入后置状态。当 2 接收到 0 的初始化消息之后,其 L>LN 因此进入连接过程(注意其中将此边的状态进行了修改,这也意味着连接后置的终止)
  • Test后置:结合下述伪代码可知,当 L>LN 时(即发送Test的片段等级高于接收到Test消息的片段),Test将被消息后置。我们以例三进行说明,一开始在 2 向 1 发送Test消息后,由于0与2组成的片段等级高,Test消息后置。后来,2 向 1 发送初始化信息导致 1 片段等级提升,后置过程终止(其进入accept与reject的判断过程)
  • report后置:结合下述伪代码可知,如果接收到report消息的边是in-branch边并且点状态为Find,则后置此消息。具体结合report过程可知,当其所有节点都report完之后会改变状态为Found,此时report后置就会终止,并进入下一阶段处理过程。以例三说明,当2节点接收到1与3的report之后就会终止report后置过程

综上,我们不难发现该算法的核心就在于以上的三个精妙的消息后置,正是这几个组成部分实现了分布式MST。

如何理解Test与report过程?

当完成初始化过程之后节点进入Test过程,首先寻找周围处于Basic状态的节点,然后将最小权重的边作为测试边并向该边发送测试请求,如果没有符合条件的测试边则直接进入report过程

接收到test消息的节点,判断 L 与 LN 的大小,当L>LN 时(即发送Test的片段等级高于接收到Test消息的片段)进入Test后置,如果不是则进入具体判断环节根据具体算法回复 accept 或 reject 以及 一些相应的消息,注意如果接收到Test消息的点A与发送Test的点B属于同一片段,并且A的test边就是这条消息转递边,那么A点继续执行test过程。

report 过程在节点没有要测试的节点或者节点接收到accept响应之后执行,判断其find-count是否为 0 ,以及 test 边是否为空,如果符合条件就改变节点状态并向in-branch边汇报report

接收到 report 消息的节点,先判断该边是否是自己的in-branch边不是的话就可以find-count-1并更新当前的片段的最值情况。在某些具体情况下会进入report后置直至所有的节点完成report

如何理解算法的片段处理逻辑?

我们从整体来看整个算法,实际上就是以片段为核心,一个片段对其边缘的连接边进行 Test 测试,然后使用 report 聚合信息,从而寻找到片段下一步的延伸方向,当然这中间还存在有很多具体的算法细节。

如何理解分布式算法与常见MST算法的优势?

缺点:通讯成本高,复杂度高

优点:可用性高,可解决大规模图计算问题,而单机算法存在性能瓶颈

代码仓库

  • Python实现:https://github.com/arjun-menon/Distributed-Graph-Algorithms/tree/master/Minimum-Spanning-Tree
  • 使用 OpenMPI 的C++实现(推荐):https://github.com/tejas-1111/GHS-algorithm

参考

https://www.slidestalk.com/u181/distributed_systems_and_algorithms08?embed

https://blog.csdn.net/giskun/article/details/40785381

https://en.wikipedia.org/wiki/Distributed_minimum_spanning_tree

http://www.wiki.yelbee.top/2020/04/30/Computation/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%80%E5%B0%8F%E7%94%9F%E6%88%90%E6%A0%91/

https://zhuanlan.zhihu.com/p/497801451

附:论文伪代码

论文链接🔗
image-20230205195452687

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
!!注意:全文有99M,由于上传文件不得超过60M,所以分成两个压缩文件,这是part1.part2在以下网页: http://download.csdn.net/detail/hellowjl1/4682120 在本书中,作者给出设计,实现和分析分布式算法的蓝图。本书适合学生、程序员、系统分析员和研究人员等不同类型的读者。本书包括这个领域最重要的算法和不可能解.而且都采用简单的自动机理论进行论述。对所有算法的正确性都给予证明.并且根据精确定义的复杂度标准分析算法的复杂度。其中涉及的问题包括资源分配、通信、分布式处理器之间的一致性、数据一致性、死锁检测、领导者进程的选取、全局快照等。    本书的内容按照系统模型组织,首先是根据定时模型.然后在定时模型内再根据进程间的通信机制。不同系统的材料分别独立成章,便于查阅。    本书论述十分严谨,但又很直观.便于读者迅速理解。本书也为读者提供设计新的算法和证明新的不可能解的基本数学工具。而且,它教给读者怎样对分布式系统进行严格的推理 ―包括形式化建模,为它们所需的行为设计精确的指标,证明它们的正确性.并且用实际的度量标准来评价它们的性能。    本书对分布式算法进行全面介绍,包括最为重要的算法和不可能性结果。绝大部分的解都给出了数学证明。这些算法都根据精确定义的复杂度衡量方法进行分析。本书还讲述针对许多典型问题的算法、各类系统模型及其能力。章后提供大量习题并列出了详细的参考文献。    本书可作为高等院校计算机系研究生的教材,尤其适合对计算机理论或体系结构感兴趣的学生学习,还适合分布式设计人员、研究人员及其相关技术人员参考。 出版者的话 专家指导委员会 译者序 前言 第1章 引言 1 1.1 相关主题 1 1.2 我们的观点 2 1.3 本书内容综述 3 1.4 参考文献注释 7 1.5 标记 7 第一部分 同步网络算法 第2章 建模i:同步网络模型 10 2.1 同步网络系统 10 2.2 故障 11 2.3 输入和输出 11 2.4 运行 11 2.5 证明方法 12 2.6 复杂度度量 12 2.7 随机化 12 2.8 参考文献注释 13 .第3章 同步环中的领导者选择 14 3.1 问题 14 3.2 相同进程的不可能性结果 14 3.3 基本算法 15 3.4 通信复杂度为o(n log n)的算法 17 3.5 非基于比较的算法 19 3.5.1 时间片算法 20 3.5.2 变速算法 20 3.6 基于比较的算法的下界 21 3.7 非基于比较的算法的下界* 25 3.8 参考文献注释 26 3.9 习题 27 第4章 一般同步网络中的算法 29 4.1 一般网络中的领导者选举 29 4.1.1 问题 29 4.1.2 简单的洪泛算法 29 4.1.3 降低通信复杂度 31 4.2 广度优先搜索 32 4.2.1 问题 32 4.2.2 基本的广度优先搜索算法 33 4.2.3 应用 34 4.3 最短路径 35 4.4 最小生成 36 4.4.1 问题 36 4.4.2 基本定理 36 4.4.3 算法 37 4.5 最大独立集 39 4.5.1 问题 40 4.5.2 随机化算法 40 4.5.3 分析* 42 4.6 参考文献注释 43 4.7 习题 43 第5章 链路故障时的分布式一致性 46 5.1 协同攻击问题―确定性版本 46 5.2 协同攻击问题―随机化版本 48 5.2.1 形式化模型 49 5.2.2 算法 49 5.2.3 不一致的下限 52 5.3 参考文献注释 54 5.4 习题 54 第6章 进程故障下的分布式一致性 56 6.1 问题 56 6.2 针对停止故障的算法 58 6.2.1 基本算法 58 6.2.2 减少通信 59 6.2.3 指数信息收集算法 61 6.2.4 带鉴别的byzantine一致性 66 6.3 针对byzantine故障的算法 66 6.3.1 举例 66 6.3.2 byzantine一致性问题的eig算法 68 6.3.3 使用二元byzantine一致的一般 的byzantine一致性问题 71 6.3.4 减少通信开销 72 6.4 byzantine一致性问题中进程的个数 74 6.5 一般图中的byzantine一致性问题 78 6.6 弱byzantine一致性 81 6.7 有停止故障时的轮数 82 6.8 参考文献注释 88 6.9 习题 89 第7章 更多的一致性问题 93 7.1 k一致性问题 93 7.1.1 问题 93 7.1.2 算法 93 7.1.3 下界* 95 7.2 近似一致性 102 7.3 提交问题 105 7.3.1 问题 105 7.3.2 两阶段提交 106 7.3.3 三阶段提交 107 7.3.4 消息数的下界 109 7.4 参考文献注释 111 7.5 习题 111 第二部分 异步算法 第8章 建模ii:异步系统模型 114 8.1 输入/输出自动机 114 8.2 自动机的操作 118 8.2.1 合成 118 8.2.2 隐藏 121 8.3 公平性 121 8.4 问题的输入和输出 123 8.5 属性与证明方法 124 8.5.1 不变式断言 124 8.5.2 轨迹属性 124 8.5.3 安全与活性属性 125 8.5.4 合成推理 126 8.5.5 层次化证明 128 8.6 复杂度衡量 130 8.7 不可区分运行 131 8.8 随机化 131 8.9 参考文献注释 131 8.10 习题 132 第二部分a 异步共享存储器算法 第9章 建模iii:异步共享存储器模型 136 9.1 共享存储器系统 136 9.2 环境模型 138 9.3 不可区分状态 140 9.4 共享变量类型 140 9.5 复杂度衡量 144 9.6 故障 144 9.7 随机化 145 9.8 参考文献注释 145 9.9 习题 145 第10章 互斥 146 10.1 异步共享存储器模型 146 10.2 问题 148 10.3 dijkstra的互斥算法 151 10.3.1 算法 151 10.3.2 正确性证明 154 10.3.3 互斥条件的一个断言证明 156 10.3.4 运行时间 157 10.4 互斥算法的更强条件 158 10.5 锁定权互斥算法 159 10.5.1 双进程算法 159 10.5.2 n进程算法 163 10.5.3 锦标赛算法 167 10.6 使用单写者共享存储器的算法 170 10.7 bakery算法 171 10.8 寄存器数量的下界 173 10.8.1 基本事实 174 10.8.2 单写者共享变量 175 10.8.3 多写者共享变量 175 10.9 使用读-改-写共享变量的互斥 179 10.9.1 基本问题 179 10.9.2 有界绕过次数 180 10.9.3 锁定权 185 10.9.4 模拟证明 187 10.10 参考文献注释 189 10.11 习题 190 第11章 资源分配 194 11.1 问题 194 11.1.1 显式资源说明和互斥说明 194 11.1.2 资源分配问题 195 11.1.3 哲学家用餐问题 196 11.1.4 解法的受限形式 197 11.2 对称哲学家用餐算法的不存在性 197 11.3 右-左哲学家用餐算法 199 11.3.1 等待链 199 11.3.2 基本算法 200 11.3.3 扩展 202 11.4 哲学家用餐随机算法* 204 11.4.1 算法* 205 11.4.2 正确性* 207 11.5 参考文献注释 212 11.6 习题 213 第12章 一致性 215 12.1 问题 215 12.2 使用读/写共享存储器的一致性 217 12.2.1 限制 218 12.2.2 术语 218 12.2.3 双价初始化 218 12.2.4 无等待终止的不可能性 219 12.2.5 单故障终止的不可能性结果 221 12.3 读/改/写共享存储器上的一致性 问题 223 12.4 其他共享存储器类型 224 12.5 异步共享存储器系统中的可计算性* 224 12.6 参考文献注释 225 12.7 习题 226 第13章 原子对象 229 13.1 定义和基本结论 229 13.1.1 原子对象的定义 229 13.1.2 规范无等待原子对象自动机 235 13.1.3 原子对象的合成 237 13.1.4 原子对象和共享变量 237 13.1.5 显示原子性的一个充分条件 241 13.2 用读/写变量实现读-改-写原子对象 242 13.3 共享存储器的原子快照 243 13.3.1 问题 243 13.3.2 带无界变量的一个算法 244 13.3.3 带有界变量的一个算法* 247 13.4 读/写原子对象 250 13.4.1 问题 250 13.4.2 证明原子性的其他引理 250 13.4.3 带无界变量的一个算法 251 13.4.4 两个写者的有界算法 254 13.4.5 使用快照的算法 258 13.5 参考文献注释 259 13.6 习题 260 第二部分b 异步网络算法 第14章 建模iv:异步网络模型 264 14.1 发送/接收系统 264 14.1.1 进程 264 14.1.2 发送/接收通道 264 14.1.3 异步发送/接收系统 268 14.1.4 使用可靠fifo通道的发送/ 接收系统的特征 268 14.1.5 复杂度度量 269 14.2 广播系统 269 14.2.1 进程 269 14.2.2 广播通道 270 14.2.3 异步广播系统 270 14.2.4 采用可靠广播通道的广播系统 的特征 270 14.2.5 复杂度度量 271 14.3 多播系统 271 14.3.1 进程 271 14.3.2 多播通道 271 14.3.3 异步多播系统 272 14.4 参考文献注释 272 14.5 习题 272 第15章 基本异步网络算法 274 15.1 环中的领导者选举 274 15.1.1 lcr算法 275 15.1.2 hs算法 278 15.1.3 peterson leader算法 278 15.1.4 通信复杂度的下界 281 15.2 任意网络中的领导者选举 286 15.3 生成的构造、广播和敛播 287 15.4 广度优先搜索和最短路径 290 15.5 最小生成 295 15.5.1 问题描述 295 15.5.2 同步算法:回顾 296 15.5.3 ghs算法:概要 296 15.5.4 更详细的算法 297 15.5.5 特殊消息 299 15.5.6 复杂度分析 301 15.5.7 ghs算法的正确性证明 301 15.5.8 简单“同步”策略 302 15.5.9 应用到领导者选举算法中 302 15.6 参考文献注释 303 15.7 习题 303 第16章 同步器 307 16.1 问题 307 16.2 局部同步器 309 16.3 安全同步器 313 16.3.1 前端自动机 314 16.3.2 通道自动机 315 16.3.3 安全同步器 315 16.3.4 正确性 315 16.4 安全同步器的实现 316 16.4.1 同步器alpha 316 16.4.2 同步器beta 317 16.4.3 同步器gamma 317 16.5 应用 320 16.5.1 领导者选举 321 16.5.2 深度优先搜索 321 16.5.3 最短路径 321 16.5.4 广播与确认 321 16.5.5 最大独立集 321 16.6 时间下界 321 16.7 参考文献注释 324 16.8 习题 324 第17章 共享存储器与网络 326 17.1 从共享存储器模型到网络模型 的转换 326 17.1.1 问题 326 17.1.2 无故障时的策略 327 17.1.3 容忍进程故障的算法 332 17.1.4 对于n/2故障的不可能性结果 335 17.2 从网络模型转换到共享存储器模型 336 17.2.1 发送/接收系统 336 17.2.2 广播系统 338 17.2.3 异步网络中一致性的不可能性 338 17.3 参考文献注释 339 17.4 习题 339 第18章 逻辑时间 341 18.1 异步网络的逻辑时间 341 18.1.1 发送/接收系统 341 18.1.2 广播系统 343 18.2 使用逻辑时间的异步算法 344 18.2.1 时钟的走动 344 18.2.2 延迟未来事件 345 18.3 应用 346 18.3.1 银行系统 346 18.3.2 全局快照 348 18.3.3 模拟一台单状态机器 349 18.4 从实际时间算法到逻辑时间算法 的变换* 352 18.5 参考文献注释 352 18.6 习题 353 第19章 一致全局快照和稳定属性检测 355 19.1 发散算法的终止检测 355 19.1.1 问题 355 19.1.2 dijkstrascholten算法 356 19.2 一致全局快照 360 19.2.1 问题 360 19.2.2 chandylamport算法 361 19.2.3 应用 364 19.3 参考文献注释 366 19.4 习题 367 第20章 网络资源分配 369 20.1 互斥 369 20.1.1 问题 369 20.1.2 模拟共享存储器 370 20.1.3 循环令牌算法 370 20.1.4 基于逻辑时间的算法 372 20.1.5 logicaltimeme算法的改进 374 20.2 通用资源分配 376 20.2.1 问题 376 20.2.2 着色算法 377 20.2.3 基于逻辑时间的算法 377 20.2.4 无环有向图算法 378 20.2.5 哲学家饮水* 379 20.3 参考文献注释 383 20.4 习题 383 第21章 带进程故障的异步网络计算 386 21.1 网络模型 386 21.2 有故障环境中一致性的不可能性 387 21.3 随机算法 388 21.4 故障检测器 390 21.5 k一致性 393 21.6 近似一致性 394 21.7 异步网络的计算能力* 395 21.8 参考文献注释 396 21.9 习题 396 第22章 数据链路协议 399 22.1 问题阐述 399 22.2 stenning协议 400 22.3 位变换协议 403 22.4 可重排序的有界标志协议 406 22.4.1 关于重排序和复制的不可能 性结论 407 22.4.2 容许丢失和重排序的有界标 志协议 408 22.4.3 不存在容许消息丢失和重排序 的高效协议 412 22.5 容许进程崩溃 414 22.5.1 简单的不可能性结论 415 22.5.2 更复杂的不可能性结论 415 22.5.3 实用的协议 418 22.6 参考文献注释 423 22.7 习题 423 第三部分 部分同步算法 第23章 建模v: 部分同步系统模型 428 23.1 mmt 定时自动机 428 23.1.1 基本定义 428 23.1.2 操作 432 23.2 通用定时自动机 434 23.2.1 基本定义 434 23.2.2 将mmt自动机转化为通用定时 自动机 437 23.2.3 操作 440 23.3 属性和证明方法 441 23.3.1 不变式 441 23.3.2 定时轨迹属性 443 23.3.3 模拟 444 23.4 构造共享存储器和网络系统的模型 449 23.4.1 共享存储器系统 449 23.4.2 网络 449 23.5 参考文献注释 449 23.6 习题 450 第24章 部分同步的互斥 452 24.1 问题 452 24.2 单寄存器算法 453 24.3 对时间故障的回复性 459 24.4 不可能性结果 461 24.4.1 时间下界 462 24.4.2 最终时间界限的不可能性结果* 462 24.5 参考文献注释 463 24.6 习题 463 第25章 部分同步的一致性 466 25.1 问题 466 25.2 故障检测器 467 25.3 基本结论 468 25.3.1 上界 468 25.3.2 下界 469 25.4 有效算法 470 25.4.1 算法 471 25.4.2 安全属性 472 25.4.3 活性和复杂度 473 25.5 涉及时间不确定性的下界* 475 25.6 其他结果* 480 25.6.1 同步进程、异步通道* 480 25.6.2 异步进程、同步通道* 481 25.6.3 最终时间界限* 481 25.7 小结 483 25.8 参考文献注释 483 25.9 习题 483 参考文献 486 索引 512
经典的最小生成算法包括Prim算法和Kruskal算法。在处理大数据量的计算和存储效率问题时,我们可以考虑使用以下几种方法来优化算法: 1. 分布式计算:将算法分解成多个子任务,分配给多个计算节点进行处理,以加快计算速度。例如,可以使用MapReduce框架对算法进行并行化处理。 2. 堆优化:在Prim算法中,可以使用优先队列来存储待选择的节点,以便能够快速找到最小边。可以使用堆来实现优先队列,从而提高算法的效率。 3. 边列表优化:在Kruskal算法中,需要对所有边进行排序,以便能够按照权重从小到大依次选择。可以使用边列表来存储所有边,并对其进行排序。但是,对于大数据量的情况,边列表可能会占用过多的内存。因此,可以使用外部排序等方法来优化边列表的存储和排序。 4. 压缩数据结构:在Kruskal算法中,需要使用并查集来判断两个节点是否在同一个集合中。可以使用路径压缩等方法来优化并查集的性能,从而减少内存消耗和计算时间。 5. 剪枝优化:在Prim算法中,可以使用剪枝法减少计算量和内存消耗。例如,可以限制待选择的节点数量,或者在优先队列中只保留最小权重的边。 6. 预处理优化:在计算最小生成之前,可以先对图进行预处理,例如删除无用边、缩小图的规模等,从而减少计算量和内存消耗。 综上所述,针对大数据量的计算和存储效率问题,我们可以使用分布式计算、堆优化、边列表优化、压缩数据结构、剪枝优化和预处理优化等方法来优化最小生成算法的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值