螺旋遍历2D矩阵的时间复杂度?

时间:2019-02-25 02:42:04

标签: python matrix time-complexity

我正在学习如何螺旋遍历2D矩阵,并且遇到了以下算法:

def spiralOrder(self, matrix):

    result = []

    while matrix:
        result.extend(matrix.pop(0))
        matrix = zip(*matrix)[::-1]

    return result

我目前很难解决这个问题的时间复杂性,而zip函数位于while循环中。

如果有人可以帮助我解释一下时间的复杂性,将不胜感激。

谢谢!

2 个答案:

答案 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))左右。

https://wiki.python.org/moin/TimeComplexity

答案 1 :(得分:0)

无论您如何遍历2D矩阵,时间复杂度在维度上始终是二次的。

一个m×n的矩阵因此需要 O(mn)的时间来遍历,而不管它是螺旋形的还是行较大的。