【问题标题】:Directed graph (topological sort)有向图(拓扑排序)
【发布时间】:2014-03-27 22:30:30
【问题描述】:

假设存在一个有向图G(V, E)(V 表示顶点,E 表示边),其中每条边 (x, y) 与权重 (x, y) 相关联,其中权重是介于 1 和10.

假设stV 中的一些顶点。

我想在 O(m + n) 时间内计算从st 的最短路径,其中m 是顶点数,n 是边数。

我在实施拓扑排序以实现这一目标时是否走在正确的轨道上?还是我忽略了另一种技术?

【问题讨论】:

  • 广度优先搜索?
  • 为什么要拓扑排序?就因为那有相同的运行时间?
  • 这与拓扑排序无关。
  • Dial 对 Dijkstra 算法的实现怎么样?
  • 只使用一个桶列表作为优先队列。我们可以证明,队列中始终不会有超过 10 个不同的标签。也许那是 Dial 的实现,也许不是,我不知道

标签: performance algorithm sorting big-o topological-sort


【解决方案1】:

您需要用于在加权图中找到从给定顶点到另一个顶点的最小路径的算法是Dijkstra's algorithm。不幸的是,它的复杂性是O(n*log(n) + m),这可能比您尝试完成的要多。

但是,在您的情况下,边缘是特殊的 - 它们的权重只有 10 个有效值。因此,您可以实现一个特殊的数据结构(一种堆,但利用 wights 的小数据集)以使所有操作保持不变。

一种可能的方法是设置 10 个列表 - 每个重量一个。在数据结构中添加边只是附加到列表中。找到最小元素是遍历 10 个列表以找到第一个非空的。这仍然是恒定的,因为将执行不超过 10 次迭代。删除最小元素也很简单——从列表中简单地删除。

使用具有相同渐近复杂度的一些数据结构的 Dijkstra 算法将是您所需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多