微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有人能告诉我解决这个 zigag 遍历问题的时间复杂度吗

如何解决有人能告诉我解决这个 zigag 遍历问题的时间复杂度吗

zigzag 遍历

这是来自 algoexpert 的问题之一,这是我涉及数学的解决方

def zigzagTraversal(arr):
out = []
test = 1
out.append(arr[0][0])
while test <= len(arr)+len(arr[0]):
    for j in range(len(arr[0])):
        for i in range(len(arr)):
            if test % 2 == 1:
                if i + j == test:
                    # print(arr[i][j])
                    out.append(arr[i][j])
            else:
                if i + j == test:
                    out.append(arr[j][i])
    test += 1
return out
print(zigzagTraversal([[1,3,4,10],[2,5,9,11],[6,8,12,15],[7,13,14,16]]))

解决方法

N=len(arr),M=len(arr[0])。此代码具有 O(NM^2+N^2M) 复杂度(或 O(N^3) 用于方形输入矩阵)。原因如下:外循环 (while) 完全等同于 for 循环(因为您在最后增加 test 并且永远不会在其他地方更改它)并且将被执行 N+M 次.然后您进入第二个循环,该循环正好执行 N 次。然后内循环 - M 次。中间循环的每一步都会重复内循环,与外循环相同。因此,我们必须将所有这些计数相乘。当然,所有内部操作都不是原子的,但对于小数据,平均而言将是 O(1)。如果您的输入很大,我建议预先分配 out(将其创建为 out = [None for _ in range(N*M)])以避免其增长成本,并将当前第一个免费索引作为附加变量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?