【问题标题】:Algorithm for efficient graph traversal高效图遍历算法
【发布时间】:2017-10-26 18:53:14
【问题描述】:
我正在为以下用例搜索算法或想法:
有向图由多个顶点组成。其中一些顶点带有一个值(如数字)注释并且没有父顶点(前身)。所有其他顶点都表示操作。仅当父顶点(前驱)的所有注释值都已知时,才能执行操作。然后将操作的结果或值存储在顶点中。
我的解决思路:
- 在集合中存储至少有一个父顶点(前驱)的所有顶点
- 当集合不为空时:
- 从集合中获取下一个顶点
- 检查所有父顶点(前驱)的值是否已知
- 如果所有值都已知:
- 从集合中移除顶点
- 执行操作
- 将运算结果存储在顶点中
- 循环(转到 2。)
- 其他:循环(转到 2。)
我的问题:我认为这个解决方案的想法可行,但效率不高(尤其是对于大型图结构)。
有没有更有效的方法来解决这个问题?
【问题讨论】:
标签:
algorithm
graph
graph-theory
graph-traversal
【解决方案1】:
有一些可能避免漫无目的地重新检查顶点,例如:
- 初始化一个整数数组,为每个顶点存储父节点的数量。
- 初始化一组有 0 个父节点的顶点(可以与第 1 步同时完成)。
- 直到该集合为空:
- 从该集合中取出一些顶点
a 并对其进行处理。
- 对于从
a 到顶点b 的每条边,递减顶点b 的父计数。如果计数达到 0,则将 b 添加到准备处理的顶点集。
【解决方案3】:
这本质上不是一个级别顺序遍历的问题吗?
鉴于此,
只有当父顶点(前驱)的所有注释值都已知时,才能执行操作。
你应该从没有父顶点的顶点开始。 (这部分你已经想好了。)
接下来,不是将它们放在一个集合中,而是将它们放在一个队列中,这样先进先出的基础实际上允许您按级别顺序处理每个顶点。
如果当前顶点的值无法计算,则将其放回队列中,否则将当前顶点可到达的顶点放入队列中。保持为具有所需父顶点值的顶点计算值。
我几乎可以说,通过一些优化,这将是最有效的方法。