如何计算图泛洪(flooding)过程生成的消息数量及对应算法、问题类别
问题解答
所属典型问题分类
这是图论和网络协议领域的典型问题,归类为广播(Broadcast)协议性能统计问题,也常作为泛洪(Flooding)协议的核心度量指标计算场景出现。
算法实现方案
你猜测修改Dijkstra算法可实现需求的思路是成立的,针对不同场景有两种主流实现方式:
- 无向无权图的常规泛洪场景,优先用BFS实现,逻辑更简单效率更高:
- 初始化总消息计数为0,给所有节点添加「是否首次接收消息」的标记,默认全为false
- 源节点标记为已接收,向所有直连邻居发送消息,总计数加上源节点的度
- 按BFS顺序遍历所有收到消息的节点:如果是首次接收,向除了消息发送方之外的所有邻居转发消息,每转发一次总计数+1;如果非首次接收直接丢弃消息不处理
- 遍历到所有节点都完成接收标记后,总计数就是泛洪产生的全部消息数量
- 带权网络按最短路径泛洪的场景,可直接修改Dijkstra算法实现:
- 在常规Dijkstra的最短距离统计基础上,额外维护每个节点的消息发送方(前驱节点)
- 每次确定某节点的最短路径后,统计该节点需要转发的邻居数量:即所有未确定最短路径、且经当前节点可获得更短路径的邻居数
- 每需要向一个邻居转发就将总计数+1,算法结束后得到的总计数就是对应泛洪场景的消息总量
两种方案都能匹配你给出的问题图的求解需求,无权场景下BFS的时间复杂度为O(V+E),带权场景下修改版Dijkstra的时间复杂度和原版一致,为O(ElogV)(采用优先队列实现时)。
内容的提问来源于stack exchange,提问作者mageover
相关产品推荐
相关产品推荐

