【问题标题】:Algorithm for efficient graph traversal高效图遍历算法
【发布时间】:2017-10-26 18:53:14
【问题描述】:

我正在为以下用例搜索算法或想法:

有向图由多个顶点组成。其中一些顶点带有一个值(如数字)注释并且没有父顶点(前身)。所有其他顶点都表示操作。仅当父顶点(前驱)的所有注释值都已知时,才能执行操作。然后将操作的结果或值存储在顶点中。

我的解决思路:

  1. 在集合中存储至少有一个父顶点(前驱)的所有顶点
  2. 当集合不为空时:
    1. 从集合中获取下一个顶点
    2. 检查所有父顶点(前驱)的值是否已知
    3. 如果所有值都已知:
      1. 从集合中移除顶点
      2. 执行操作
      3. 将运算结果存储在顶点中
      4. 循环(转到 2。)
    4. 其他:循环(转到 2。)

我的问题:我认为这个解决方案的想法可行,但效率不高(尤其是对于大型图结构)。

有没有更有效的方法来解决这个问题?

【问题讨论】:

    标签: algorithm graph graph-theory graph-traversal


    【解决方案1】:

    有一些可能避免漫无目的地重新检查顶点,例如:

    1. 初始化一个整数数组,为每个顶点存储父节点的数量。
    2. 初始化一组有 0 个父节点的顶点(可以与第 1 步同时完成)。
    3. 直到该集合为空:
      1. 从该集合中取出一些顶点a 并对其进行处理。
      2. 对于从a 到顶点b 的每条边,递减顶点b 的父计数。如果计数达到 0,则将 b 添加到准备处理的顶点集。

    【讨论】:

      【解决方案2】:

      想要做的就是所谓的“拓扑排序”——按照处理顶点的顺序,每个节点的前驱都必须在它之前出现:https://en.wikipedia.org/wiki/Topological_sorting

      有几种有效的算法。一个与您的非常接近,但您只有在没有未完成的前辈时才将一个顶点放入集合中。 (哈罗德的回答)

      【讨论】:

        【解决方案3】:

        这本质上不是一个级别顺序遍历的问题吗?

        鉴于此,

        只有当父顶点(前驱)的所有注释值都已知时,才能执行操作。

        你应该从没有父顶点的顶点开始。 (这部分你已经想好了。)

        接下来,不是将它们放在一个集合中,而是将它们放在一个队列中,这样先进先出的基础实际上允许您按级别顺序处理每个顶点。

        如果当前顶点的值无法计算,则将其放回队列中,否则将当前顶点可到达的顶点放入队列中。保持为具有所需父顶点值的顶点计算值。

        我几乎可以说,通过一些优化,这将是最有效的方法。

        【讨论】:

          猜你喜欢
          • 2018-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-05
          • 2012-08-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多