Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 复杂矩阵寻径分析_Python_Algorithm_Time Complexity_Path Finding - Fatal编程技术网

Python 复杂矩阵寻径分析

Python 复杂矩阵寻径分析,python,algorithm,time-complexity,path-finding,Python,Algorithm,Time Complexity,Path Finding,最近在我的作业中,我被要求解决以下问题: 给定一个由0和1组成的nxn阶矩阵,求出从[0,0]到[n-1,n-1]的路径数,这些路径只经过0(它们不一定是不相交的),在那里只能向下或向右走,而不能向上或向左走。返回一个顺序相同的矩阵,其中[i,j]项是原始矩阵中经过[i,j]的路径数,解决方案必须是递归的 我的python解决方案: def find_zero_路径(M): n、 m=len(m),len(m[0]) dict={} 对于范围(n)中的i: 对于范围内的j(m): M_top,M

最近在我的作业中,我被要求解决以下问题:

给定一个由0和1组成的nxn阶矩阵,求出从[0,0]到[n-1,n-1]的路径数,这些路径只经过0(它们不一定是不相交的),在那里只能向下或向右走,而不能向上或向左走。返回一个顺序相同的矩阵,其中[i,j]项是原始矩阵中经过[i,j]的路径数,解决方案必须是递归的

我的python解决方案:

def find_zero_路径(M):
n、 m=len(m),len(m[0])
dict={}
对于范围(n)中的i:
对于范围内的j(m):
M_top,M_bot=块(M,i,j)
十、 Y=查找数量路径(M_top),查找数量路径(M_bot)
dict[(i,j)]=X*Y
L=[[dict[(i,j)]表示范围(m)中的j]表示范围(n)中的i]
返回L[0][0],L
def块(M、k、l):
n、 m=len(m),len(m[0])
断言k1:
新的μM=M[:n-1]
X=查找数量(新的、dict)
dict[(n-1,m)]=X
返回X
新的μM1=M[:n-1]
对于范围(n)中的i,新的_M2=[M[i][:M-1]
十、 Y=查找数值内存(新数值M1,dict),查找数值内存(新数值M2,dict)
dict[(n-1,m)],dict[(n,m-1)]=X,Y
返回X+Y
我的代码基于这样一个想法,即在原始矩阵中通过[i,j]的路径数等于从[0,0]到[i,j]的路径数与从[i,j]到[n-1,n-1]的路径数的乘积。另一个想法是从[0,0]到[i,j]的路径数是从[0,0]到[i-1,j]和从[0,0]到[i,j-1]的路径数之和。因此,我决定使用一本字典,它的键是[M[I][j]表示范围内的j(k)]表示范围内的I(l)]或[M[I][j]表示范围内的j(k+1,n)]表示范围内的I(l+1,n)]的形式的矩阵。不幸的是,你的导师是对的。 这里有很多东西需要打开:

在开始之前,请注意。请不要使用dict作为变量名。疼死了。Dict是python中字典构造函数的保留关键字。用变量覆盖它是一种不好的做法

首先,如果只计算矩阵中的一个单元格,那么计算M_top*M_bottom的方法很好。在你这样做的过程中,你不必要地一次又一次地计算一些块——这就是为什么我考虑递归,我会用动态编程来处理这个问题。从开始到结束,从结束到结束,然后我会去计算产品,并完成它。不需要O(n^6)的单独计算。由于必须使用递归,我建议缓存部分结果并尽可能重用它们

其次,问题的根源和您的潜在问题的原因。它隐藏在find_num_mem函数中。假设你计算矩阵中的最后一个元素-结果[n] [n]域,让我们考虑最简单的情况,其中矩阵是满零的,所以每个可能的路径都存在。
  • 在第一步中,递归创建分支[N][N-1]和[N-1][N]
  • 在第二步中,[N-1][N-1],[N][N-2],[N-2][N],[N-1][N-1]
  • 在第三步中,再次从前面的每一步创建两个分支-一个指数爆炸的美丽示例

  • 现在如何进行:您将很快注意到一些分支正在被一次又一次地复制缓存结果。

    如果有一个零循环,路径数将是无限的。请问这是什么地址?(例如,通过指定不存在循环或只查找最短路径)此外,听到需要使用递归也有点痛苦。这有什么原因吗?我忘了提一下,你只能向下或向右走,不能向后或向上走,因此没有周期,修正了它。而且,递归的原因仅仅是因为作业的主题是递归。