Python 复杂矩阵寻径分析
最近在我的作业中,我被要求解决以下问题: 给定一个由0和1组成的nxn阶矩阵,求出从[0,0]到[n-1,n-1]的路径数,这些路径只经过0(它们不一定是不相交的),在那里只能向下或向右走,而不能向上或向左走。返回一个顺序相同的矩阵,其中[i,j]项是原始矩阵中经过[i,j]的路径数,解决方案必须是递归的 我的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
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]域,让我们考虑最简单的情况,其中矩阵是满零的,所以每个可能的路径都存在。
现在如何进行:您将很快注意到一些分支正在被一次又一次地复制缓存结果。如果有一个零循环,路径数将是无限的。请问这是什么地址?(例如,通过指定不存在循环或只查找最短路径)此外,听到需要使用递归也有点痛苦。这有什么原因吗?我忘了提一下,你只能向下或向右走,不能向后或向上走,因此没有周期,修正了它。而且,递归的原因仅仅是因为作业的主题是递归。