Java 中的 Floyd Warshall 具有 15000 个顶点的矩阵

Posted

技术标签:

【中文标题】Java 中的 Floyd Warshall 具有 15000 个顶点的矩阵【英文标题】:Floyd Warshall in Java with a matrix of 15000 vertex 【发布时间】:2014-07-17 22:40:09 【问题描述】:

我们正在开展一个小型学校项目,使用 Floyd-Warshall 在 Java 中实现一种算法(我们不能使用另一个算法)。

算法运行良好,我们使用成本数组作为 Floyd-Warshall 算法的输入。

老师有 5 个文件要检查,我们传递了 4 个,但第 5 个是一个包含 15 000 个顶点的数组,这意味着一个包含 15 000 * 15 000 个整数的数组。

Java 因为内存而拒绝使用它。你知道如何通过这个吗?

谢谢

【问题讨论】:

你可以尝试增加虚拟机内存 Just increase your heap memory of the jvm 15k*15k 超过 200 MB 啊忘了说我们要在老师电脑上启动它,他不想让我们触及他的参数:( Floyd 算法的复杂度是 O(N^3),对于 N=15000 来说太大了,你的老师这辈子都得不到答案 :) 【参考方案1】:

好吧,算法在最坏情况下的空间复杂度是Θ(n^2),在最坏情况下你无能为力。

但是,通过使用sparse matrix 实现而不是二维数组,您可以针对某些特定情况对其进行优化,其中图形非常稀疏,并且有很多对 (v1,v2) 使得从v1v2 没有路径(没有路径!不仅是边缘)。

除此之外,你基本上只能increase the jvm's heap memory。

【讨论】:

+1 当非零值是最常见的值时,稀疏矩阵方法也适用于(诚然不太可能)的情况。虽然仔细想想,如果图没有完全连接,这正是这种情况。【参考方案2】:

检查您的数组是否使用了足够大以容纳最大路径长度的最小数据类型。

还要检查您使用的是未装箱的原语(即使用 int 而不是 java.lang.Integer),因为这(可能)更快并且使用更少的内存。

【讨论】:

以上是关于Java 中的 Floyd Warshall 具有 15000 个顶点的矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Floyd-Warshall 算法返回具有相同权重的每条最短路径

lisp 中的邻接矩阵/Floyd/Warshall

Rust 中的快速惯用 Floyd-Warshall 算法

Floyd-Warshall 算法逻辑 - 卡住了

我的 Floyd-Warshall C++ 实现中的错误

Floyd/Warshall Algorithm mod 在最大长度 k 处找到最便宜的路径