Java 遍历几乎完全无向加权图的最佳方法

Java 遍历几乎完全无向加权图的最佳方法,java,algorithm,graph,graph-algorithm,Java,Algorithm,Graph,Graph Algorithm,需要以下问题的优化解决方案的帮助 根据成本,我要么只使用新边遍历图形,要么只使用 旧边,两个都可以,但我需要在有限的毫秒内通过测试, 旧边的算法把我拖下水了 我需要一个方法来优化这个,任何建议都欢迎 编辑:出于安全原因,我正在删除算法,对不起,我是新来的,所以我不这么做 知道我需要做什么才能删除帖子,因为它已经有了答案我在你的代码中只看到了一个队列。这意味着您只能从一个方向进行搜索 你可能想看看 我最初的算法建议依赖于对问题的错误解读。此外,教科书中的广度优先搜索(Width first sea

需要以下问题的优化解决方案的帮助

根据成本,我要么只使用新边遍历图形,要么只使用 旧边,两个都可以,但我需要在有限的毫秒内通过测试, 旧边的算法把我拖下水了

我需要一个方法来优化这个,任何建议都欢迎

编辑:出于安全原因,我正在删除算法,对不起,我是新来的,所以我不这么做
知道我需要做什么才能删除帖子,因为它已经有了答案

我在你的代码中只看到了一个队列。这意味着您只能从一个方向进行搜索

你可能想看看


我最初的算法建议依赖于对问题的错误解读。此外,教科书中的广度优先搜索(Width first search)或Dijkstra(Dijkstra)在这种大小的图上不太可能在合理的时间内完成。可能有一个提前终止的技巧,你可以在大的情况下使用;Niklas B.链接到的线程建议了几种方法(以及其他一些方法)。我找不到一个可以证明有效的提前终止合同的方法

这些微观优化注释仍然是相关的,但是:

我建议不要使用Java内置的
队列
容器(或者在编程竞赛中使用任何其他内置Java容器)。它将4字节的
int
转换为一个庞大的
整数结构。这很可能就是你爆发的原因。您可以使用一个500000长的
int[]
来存储队列中的数据,而使用两个int来存储队列前后的数据。通常,您希望避免在Java竞赛编程中实例化
对象
s,因为它们的开销很大


同样,我建议将图形的边表示为一个大的
int[]
或一个500000长的
int[][]
,以减少这部分开销。

您好!像这样的问题最好在“u是什么”[]中提问?什么是q?这可能是我第三次看到这个问题了。怎么回事?:)不管怎么说,我接受了我的分段树方法,而且它非常简短和一般。问题陈述说“每辆新火车都替换了一辆旧火车”,所以我认为你也必须对旧火车路线进行BFS。j_random_hacker是对的,你可以使用旧的边缘,它们只是有不同的成本。我不认为这是解决方案,很抱歉,我忘了提到这一点,在一些测试中,你有大约300000个节点,这些节点最初都相互连接,然后其中一些节点被替换(或者说,两条边之间的成本是这样的),我认为最好的方法是只遍历新的边,因为它们很少……我正试图按照@tmyklebu所说的那样做,它与一个小矩阵一起工作,比如[100][100],但是当我尝试制作一个[100000+][100000+]时,它崩溃了,这给了我一个内存不足的错误,有什么想法吗?@user2288240:不要显式地形成旧的列边。BFS仅适用于新列车边缘。我将更新我答案的第一段,使之成为一个很快就能运行的算法;我最初错误地理解了新列车与旧列车并排运行的问题。它说:“双向搜索是一种图形搜索算法,它在有向图中找到从初始顶点到目标顶点的最短路径。”,这是一个无向图,你可以想象一个无向图是一个有向图(双向)。改善是指数级的。如果假设平均度为k,距离为L。那么单向搜索大约为k^L,而双向搜索大约为2*k^(L/2),我将如何实现它?使用2个队列?第二个我用N(最后一个节点)初始化,而(!queue.isEmpty()&&!newqueue.isEmpty())然后我从每个列表中轮询一个元素,这是如果它变得有点模糊,你知道我可以遵循一个好的伪码,还是一个现有的代码吗?在一个有500000^2条边的图中进行双向搜索仍然太慢(如果我没有弄错的话,最短路径的长度可以大于5)你可能是对的Niklas B,如果这个解决方案只将时间减半,它仍然是不够的,但我仍然愿意尝试它,一旦我找到一个足够好的实现它。。。