Python 螺旋序矩阵的时空复杂度(矩阵)

Python 螺旋序矩阵的时空复杂度(矩阵),python,list,time-complexity,complexity-theory,Python,List,Time Complexity,Complexity Theory,我正在阅读Python编程访谈的内容(Aziz、Lee、Prakash),不理解他们的算法的空间和时间复杂性。要求以螺旋顺序返回矩阵的问题(示例) 在算法的最后,作者指出这是O(n^2)时间复杂度,和O(1)空间复杂度。我已经有几年没有正式研究复杂性了,所以我对这两种说法都不理解。在下面的代码中,我们构建了一个全新的数组,所有元素按螺旋顺序排列,这让我相信这不是一个就地操作,因此空间复杂度为O(nxn) 对于时间的复杂性,我也感到困惑。对于每个元素,我们只在2D数组中迭代一次。因此它不被认为是O

我正在阅读Python编程访谈的内容(Aziz、Lee、Prakash),不理解他们的算法的空间和时间复杂性。要求以螺旋顺序返回矩阵的问题(示例)

在算法的最后,作者指出这是O(n^2)时间复杂度,和O(1)空间复杂度。我已经有几年没有正式研究复杂性了,所以我对这两种说法都不理解。在下面的代码中,我们构建了一个全新的数组,所有元素按螺旋顺序排列,这让我相信这不是一个就地操作,因此空间复杂度为O(nxn)

对于时间的复杂性,我也感到困惑。对于每个元素,我们只在2D数组中迭代一次。因此它不被认为是O(n)吗?这与将其展平成一维阵列并遍历一次有什么不同

def matrix_in_spiral_order(square_matrix):
    SHIFT = ((0,1),(1,0),(0,-1),(-1,0))
    direction = x = y = 0
    spiral_ordering = []

    for _ in range(len(square_matrix)**2):
        spiral_ordering.append(square_matrix[x][y])
        square_matrix[x][y] = 0
        next_x,next_y = x + SHIFT[direction][0], y+ SHIFT[direction][1]
        if (next_x not in range(len(square_matrix)) or next_y not in range(
              len(square_matrix)) or square_matrix[next_x][next_y] == 0):
            direction = (direction +1) & 3
            next_x, next_y = x+ SHIFT[direction][0], y + SHIFT[direction][1]
        x,y = next_x, next_y
    return spiral_ordering

我最终用另一种解决方案递归地解决了这个问题,但我仍然想了解他们是如何对上述算法进行分析的。

看来他们对N的定义是矩阵边的长度,而你对N的定义是矩阵边的乘积。这似乎是六个一个,半打另一个,虽然它是开放的辩论,以减少误导

至于空间复杂性,他们的解释似乎是返回的结果不算数。这是很公平的,但它确实需要明确,我认为你的直觉在表达对他们两种说法的怀疑时是正确的


顺便说一句,我同意@Blorgbeard的说法,他们提供的算法不够典型。

看起来相当糟糕。。破坏原始矩阵,如果任何单元格已包含零,则中断。。如果你把n定义为矩阵一维的长度,我想它是O(n^2)。但我不知道它是怎样的O(1)空间。我想你需要问阿齐兹、李或普拉卡什他们的解释。很好。我回去检查他们是否提出了输入的初始假设,但他们没有。看起来有点马虎。编辑:我错了,他们确实说过假设数组中没有0个条目。在最初的解释中,它被掩埋了。好的,很好,很有意义。我怀疑可能是这样的,但他们并不清楚n(n对n)的情况。如果这只是一个定义问题,我可以接受。谢谢你,先生。对,我的理解是,他们本可以说得更清楚些,但最终,你们说的是同一件事。有时,当他们做出类似“O(1)space”这样的语句时,需要一些灵活性才能直觉地知道他们要做什么(我们可以假设作者意识到他们已经创建了一个与输入大小相等的内存结构)。有些问题指定需要返回一个新的结构,而忽略它并以一种忽略“就地vs不变异”规范的方式计算大O似乎很常见。