【发布时间】:2014-12-29 12:01:47
【问题描述】:
我正在尝试查找数据集中两个节点之间的最短路径。一世 实现了dijkstra算法并用它来证明 给定两个节点(例如:Andrew_Card 和 Dick_Cheney)没有 在源和目的地之间存在一条路径。但是,我发现 我的程序被操作系统杀死了。
调试后发现问题可能与资源有关 在 RAM 中分配。至于dijkstra算法,如果节点数, n=16,375,503,则空间需求为
n*n = 16,375,503 * 16,375,503 > 10^{14}.
要在内存中运行这个算法,我们至少需要
(10^{14} * 4) / (1024 * 1024 * 1024) = 10^5 GB (approximately equal)
of RAM.
因此,无法使用以下方法找到最短路径 dijkstra 如果我们打算在内存中保留一个大的连接图。 如果我错了,请纠正我,因为我一直坚持这个问题?或者如果我应该检查其他可能的原因,那么也请指出它。
我用 C++ 实现了程序
没有。边数=25,908,132
【问题讨论】:
-
图有多少条边?
-
没有。边数=25,908,132
-
你真的需要 Dijkstra 来证明不存在吗?简单的 BFS 还不够吗?
-
Dijksta 的内存消耗量很大,如果您确信这是导致您的问题的原因,请考虑更改搜索算法。例如尝试迭代深化算法en.wikipedia.org/wiki/Iterative_deepening_depth-first_search。它既完整又优化
-
我会支持@user2040251 的回答。由于您只有 2M 条边和 1M 节点,因此您可以使用大约 100 万个条目的邻接列表,每个条目平均长度为 2 条记录。这意味着内存需求很可能低于 1G,而不是 10^5 G。如果您使用 64 位 c++ 编译器和正确的数据结构,内存应该根本不是问题。