问题:在未加权的无向图中找到最短路径。
广度优先搜索可以找到两个节点之间的最短路径,但这可能需要O(| V | + | E |)时间。预先计算的查找表将允许在O(1)时间内回答请求,但代价是O(| V | ^ 2)空间。
我想知道:是否有一种算法可以提供更细粒度的时空权衡?换句话说,是否存在以下算法:
在实践方面:该图表是800,000个节点,被认为是一个小世界网络。所有对最短路径表将大约为千兆字节 - 这些日子并不令人愤慨,但它不符合我们的要求。
然而,我出于好奇而问我的问题。让我夜不能寐的是不“我怎么能减少全对查找表的缓存未命中?”,但“那里有一个我从未听说过的完全不同的算法吗? “
答案可能是否定的,那没关系。
答案 0 :(得分:1)
您应该首先查看Dijkstra's algorithm以找到最短路径。 a *算法是一种变体,它使用启发式来减少计算起始节点和目标节点之间的最佳路线所花费的时间(例如欧氏距离)。您可以修改此启发式以获得性能或准确性。
答案 1 :(得分:1)
如果查找表太大而无法存储在磁盘上,那么您的输入集似乎必须非常大。我假设数据不适合RAM,这意味着您应该调整使用的任何算法以最小化读取和写入的数量。每当磁盘涉及space == time时,因为写入磁盘的速度很慢。
您应该使用的确切算法取决于您拥有的图表类型。您可能会对This research paper感兴趣。完全披露:我自己没有看过,但似乎它可能就是你在寻找的东西。
编辑:
如果图(几乎)连接了一个小世界网络,则查找表不能小于V ^ 2。这意味着所有查找都需要磁盘访问。如果边缘适合主存储器,则每次计算路径可能更快。否则,您可以从包含所有shortests路径长度的表中计算路径。您可以从该表重建路径。
关键是确保表中任何一个方向上彼此靠近的条目在磁盘上也彼此接近。这种存储模式实现了:
1 2 1 2 5 6
3 4 3 4 7 8
9 10 13 14
11 12 15 16
它也适用于缓存层次结构。
为了计算表,您可以使用修改后的Floyd-Warshall,以块为单位处理数据。这将允许您在合理的时间内执行计算,尤其是在并行化时。