所以基本上,我有一个n乘m的浮点值数组,我试图找到任何第1行值和任何第m行值之间的最短路径。图表中的节点(i, j)
对于不在边缘{(i, j+1), (i-1, j+1), i+1, j+1)}
且不在底行(0 < i < n-1)
的任何节点都有子(j < m-1)
。我正在寻找一种算法来及时解决这个特定的问题。我目前的思路围绕A *搜索,但让我知道你的想法。
答案 0 :(得分:1)
动态解是O(NM)或O(M ^ 2)。而且它不能在此之下 - 这是任何更好的解决方案的反例。假设您要在第一行的最左边元素和最后一行的最左边元素之间找到一条路径。让我们看一下这种形式的矩阵:
10000000000000
11000000000000
11100000000000
11110000000000
11111000000000
11111100000000
11111110000000
11111111000000
11111110000000
11111100000000
11111000000000
11110000000000
11100000000000
11000000000000
10000000000000
“1s”是您可能在从源到目标元素的路径上经历的元素。 “0”是你无法通过的元素。
“1”的数量是NM / 4阶,因此O(NM)(实际上,Min(NM,M ^ 2),见下文)。因此,读取该矩阵中的每个1的算法将具有> = O(NM)复杂度。
另一方面,不读取所有“1”的算法将是不正确的。
证明:让矩阵中的数字为权重。选择“1”算法不读取。将1更改为0.5。该算法的输入失败,因为最佳路径现在经过一个它从未读过的元素(因为它第一次读取的元素都没有改变,它也会读取相同的元素,除非它是不确定的,在这种情况下它是一个随机的机会是否会起作用,这也使它不正确。)
然而,良好的O(NM)解决方案应该适用于1000x1000矩阵(低于一秒)。如果您只击中了必须击中的元素,可以将其优化为Min(M ^ 2,MN)(例如,如果宽度增加到10000000,则在我的示例矩阵中,您不必阅读添加的元素)。同样,如果高度增加到10000000,则没有M ^ 2顺序读取,因为您没有超出矩阵的边界。但是,正如你所说的那样,两个尺寸都非常大,我认为这没有什么帮助。