谁能告诉我我解决这个之字形遍历问题的时间复杂度
Can someone tell me the time complexity of my solution to this problem of zigag traversal
之字折线遍历
这是 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)]
)以避免其增长成本并将当前第一个免费索引保留为附加变量。
之字折线遍历
这是 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)]
)以避免其增长成本并将当前第一个免费索引保留为附加变量。