【问题标题】:Is there an efficient way to find shortest paths in a functional graph?有没有一种有效的方法可以在函数图中找到最短路径?
【发布时间】:2020-07-28 19:57:57
【问题描述】:

我的任务是在具有V 节点的功能图中处理Q 最短路径查询。 Q 和 V 是最大为 100000 的整数。

我的第一个想法是使用 Floyd-Warshall 算法来有效地回答查询,但是这个算法需要O(V^3) 时间来计算最短路径,这太慢了。

我的第二个想法在O(QV) 时间运行,因为对于每个查询,我都从起始节点开始并遍历图表,直到发现一个循环或到达目标节点。

但是,这个解决方案还是太慢了;当V 和Q 变大时,它没有机会快速处理查询。我认为有一些预处理或其他技术可以用来解决这个问题,但我无法找到任何在线资源来帮助指导我。有人可以帮帮我吗?

【问题讨论】:

  • 这个问题与 C++ 有什么关系?什么是O(QV)?

标签: algorithm graph-theory shortest-path


【解决方案1】:

函数图意味着每个节点只有一个出边,因此A和B之间的最大步数不能超过不遇到循环的顶点数。你应该是 O(V)。

由于没有选择,您可以轻松构建一个记录两个节点之间距离的 CostMap[V][V],并在遇到查询时懒惰地填充它;因此连续查询将接近恒定时间。

【讨论】:

  • 感谢您的帮助。我应该提到这一点,但是V 在问题中可以达到100000 的量级,这意味着CostMap[V][V] 可能会超过内存限制。对于这个问题,您还有其他建议吗?
  • 有点复杂,但你可以制作一个哈希表,连接 src,dst 以形成一级索引。只有 |V|连接,所以如果你选择了下一个素数 > |V|,那么只需重新探测,直到找到正确的(或空的)条目。
  • 对不起,这不太对;那只会覆盖基本的;传递的将是 |V|^2 / 2。您可能必须“管理”缓存...
【解决方案2】:

有很多为此目的而设计的算法,您可以查找深度优先搜索 (DFS) 或广度优先搜索 (BFS) 算法。与 Djikstra 算法和 A*(A 星)算法一样,最后一种算法经常用于视频游戏的寻路。它们各有优缺点,具体取决于您的网络架构,但应该适合您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多