我有一个练习,要求对矩阵'm'的元素进行迭代,困难之处在于运行时间应该是线性的,这意味着如果我使用forloops,则只允许一个。
现在的问题是,我总是发现自己想使用2个forloop,但是运行时间不是线性的,而是二次的。我正在考虑只遍历m [i],然后检查这些是否仅仅是Int 0,但这又是2个forloop,或者看看我是否可以加入这些元素。可悲的是,我找不到任何有用的东西。我还考虑过使用“列表中的x”参数,但这也无济于事。
先谢谢了。
m = [[0,0,0],
[1,0,1],
[1,0,0]]
#for i in m
#check all elements in m[i] for Ints '0'
#m[0] --> All Elements are the Integer 0
#--> Output: True.
#The output should be a Boolean 'True', when the elements of one m[i] are all Integers 0.
答案 0 :(得分:0)
我要记住,运行时分析基于输入的大小。也就是说,如果您的输入包含n个元素,并且对每个元素仅进行一次迭代,则此值为O(n)
。如果矩阵的大小为n x m
,那么我认为线性度将定义为O(n x m)
,即输入大小呈线性。
此外,嵌套的for循环的存在并不一定意味着程序的运行时是二次的,尽管这可能是思考运行时的有用方法。
编辑:这不会改变理论上的运行时间,但是您可以研究向量化的内置函数(例如python中的sum
)来处理所有行。就像我说的那样,这不会改变算法的运行时间,但是在底层进行优化和向量化可以加快每个矩阵元素的简单迭代速度。
详细说明“两个for循环总是表示O(n ^ 2)”:这仅在以下情况下适用:
# n elements in the input
for i in range(n):
for j in range(n):
# do things
# another possibility
# n elements in the input
for i in range(n):
for j in range(i):
# worst case, i == j, bringing this to O(n^2)
# do things
答案 1 :(得分:0)
您可以使用以下代码遍历矩阵:
m = [[0,0,0],
[1,0,1],
[1,0,0]]
r = 3
c = 3
for j in range(r*c):
print ( "m[", j // c,"][",j % c,"] = ", m[j // c][ j % c] )
礼物:
m[ 0 ][ 0 ] = 0
m[ 0 ][ 1 ] = 0
m[ 0 ][ 2 ] = 0
m[ 1 ][ 0 ] = 1
m[ 1 ][ 1 ] = 0
m[ 1 ][ 2 ] = 1
m[ 2 ][ 0 ] = 1
m[ 2 ][ 1 ] = 0
m[ 2 ][ 2 ] = 0
为了更清楚地说明问题,我将r
用于行数,将c
用于列数。它使用整数除法运算符//
和%
模运算符来从嵌套for
循环中获得可用的正态索引。