我正在学习如何螺旋遍历2D矩阵,并且遇到了以下算法:
def spiralOrder(self, matrix):
result = []
while matrix:
result.extend(matrix.pop(0))
matrix = zip(*matrix)[::-1]
return result
我目前很难解决这个问题的时间复杂性,而zip函数位于while循环中。
如果有人可以帮助我解释一下时间的复杂性,将不胜感激。
谢谢!
答案 0 :(得分:0)
此问题的已知时间复杂度是常数O(MxN),其中M是MxN矩阵中的行数,N是列数。这是一个很棒的算法,但看起来可能会更慢。
更仔细地查看它,在循环的每次迭代中,您都需要执行以下操作:
pop() # O(1)
extend() # O(k) where k is the number of elements added that operation
*matrix # O(1) -> python optimizes unpacking for native lists
list(zip()) # O(j) -> python 2.7 constructs the list automatically and python 3 requires the list construction to run
[::-1] # O(j/2) -> reverse sort divided by two because zip halved the items
无论循环迭代有多少次,到完成时您都将至少对矩阵中的每个元素(MxN个元素)调用result.extend。因此最好的情况是O(MxN)。
我不太确定的是重复的zip和列表反转添加了多少时间。该循环仅被调用大约M + N-1次,但是对(M-1)* N个元素然后在(M-1)*(N-1)个元素上执行zip / reverse操作,依此类推。我最好的猜测是这种函数至少是对数的,因此我认为总体时间复杂度大约在O(MxN log(MxN))左右。
答案 1 :(得分:0)
无论您如何遍历2D矩阵,时间复杂度在维度上始终是二次的。
一个m×n的矩阵因此需要 O(mn)的时间来遍历,而不管它是螺旋形的还是行较大的。