有效地找到最低和路径

时间:2014-01-29 17:38:40

标签: algorithm

这是一个很大的问题,但我有点卡住了!

我想知道这个问题或类似问题是否有名称。

我可能过于复杂地找到了解决方案,但是如果没有完整的暴力搜索(我当前的实现),我想不出办法。这对于所涉及的申请是不可接受的。

我想知道是否有任何方法可以简化这个问题,或者我可以采用的实施策略(语言/工具选择是开放的)。

以下是该问题的简要说明:

给定 n 长度 k 的序列:

a = [0, 1, 1] == [a1, a2, a3]
b = [1, 0, 2] == [b1, b2, b3]
c = [0, 0, 2] == [c1, c2, c3]

通过序列找到长度 k 的路径(我将给出从a1开始的示例,但希望您能够了解相同的路径需要从b1,c1派生)

a1 -> a2 -> a3
a1 -> b1 -> b2
a1 -> b1 -> a2
a1 -> b1 -> c1
a1 -> c1 -> c2
a1 -> c1 -> a2
a1 -> c1 -> b1

我想知道哪条路径的总和最低:

a1 -> a2 -> a3 == 2
a1 -> b1 -> b2 == 1
a1 -> b1 -> a2 == 2
a1 -> b1 -> c1 == 1
a1 -> c1 -> c2 == 0
a1 -> c1 -> a2 == 1
a1 -> c1 -> b1 == 1

所以在这种情况下,样本 a1 - > c1 - > c2是最低的。

编辑:

抱歉,只是为了清除导出路径的规则。 例如,如果您尚未用尽 b2 ,则可以从节点 a1 移动到 b2 ,并且已经耗尽了该序列中的上一个节点(的 B1 )。

2 个答案:

答案 0 :(得分:1)

使用Dynamic Programming

的替代解决方案

假设数组以矩阵A给出,使得每一行与原始数组之一相同。您的矩阵大小为(n+1)x(k+1),并确保A[_][0] = 0

现在,使用DP解决它:

f(x,y,z) = min  { f(i,y,z-1) | x < i <= n} [union] { f(i+1,0,z) }  + A[x][y]
f(_,_,0) = 0
f(n,k,z) = infinity for each z > 0

想法:在每个步骤中,您可以选择转到以下每一行(同一列) - 或转到下一列,同时减少所需的更多节点数。
转移到下一列是通过虚拟索引A[_][0]完成的,不需要减少需要更多而且没有成本的节点数,因为A[_][0] = 0

<强>复杂度:
这个解决方案基本上是一种蛮力,但是使用对f(_,_,_)每个已经探索过的值的记忆,你基本上只需要填充一个大小为O(n*k^2)的矩阵,其中每个单元格需要{{1}在第一次观察时计算的时间 - 但实际上可以在每步的O(1)中迭代计算,因为你只需要用行 1 中的新元素进行最小化。这使你O(n) - 比蛮力更好。


(1)这是由O(n*k^2)完成的,我们已经知道min{x1,x2,x3,...,xk} = min{x_k, min{x1,...,k_k-1}}

答案 1 :(得分:0)

您可以实现A *算法的修改版本。

  1. 复制矩阵并将其填充为0s
  2. 从最后到第一个的foreach二次对角线m
    1. 在m中的Foreach cell n       4.新矩阵的单元n =旧矩阵单元n减min(新矩阵中的单元格n,新矩阵中n的右侧单元格)。
  3. 新矩阵中的单元格0,0是最短路径
  4. ** 在上面的伪代码上实现A algorithem。

相关问题