对嵌套的 for 循环如何既是 O(n!) 又是 O(n^2) 感到困惑
Confused about how nested for loops could be both O(n!) and O(n^2)
假设有一个简单的嵌套 for 循环:
for i in range(0, n):
for j in range(0, n):
print(i*j)
几乎每个人都很容易将其视为 O(n^2)
。现在,如果我们修改嵌套的 for 循环:
for i in range(0, n):
for j in range(i, n):
print(i*j)
它会按照 n x n-1 x n-2 ... x 1
的路线发展,对吧?这将是相同的 n!
,这应该是一个可怕的上限。那我在这里错过了什么?为什么 for 循环的较小版本明显跳过循环的几次迭代导致更糟糕的大 o 表示法?
那个计算应该是n + n-1 + n-2 ... + 1
,也就是O(n²)。
for i in range(0, n):
for j in range(i, n):
print(i*j)
- 在外循环的第一次迭代中,内循环执行n次操作。
- 第二个,n-1次操作。
- 第三个,n-2次操作
- ...等等,直到内循环只进行 1 次迭代。
n + n-1 + n-2 + ... + 1 = O(n^2),乘法从何而来?
请注意,从学究意义上讲,O(n^2) 也是 O(n!)。也就是说,O(n!) 包括 O(n^2)(然后是一些)的函数。
我也是新来的。根据我的理解,我认为
for i in range(0,n) -> n 次
对于范围 (i,n) 中的 j -> n-i 次
因为只有 2 个循环,这意味着 n * (n-i) 用于整个操作。它应该只是 O(n^2).
假设有一个简单的嵌套 for 循环:
for i in range(0, n):
for j in range(0, n):
print(i*j)
几乎每个人都很容易将其视为 O(n^2)
。现在,如果我们修改嵌套的 for 循环:
for i in range(0, n):
for j in range(i, n):
print(i*j)
它会按照 n x n-1 x n-2 ... x 1
的路线发展,对吧?这将是相同的 n!
,这应该是一个可怕的上限。那我在这里错过了什么?为什么 for 循环的较小版本明显跳过循环的几次迭代导致更糟糕的大 o 表示法?
那个计算应该是n + n-1 + n-2 ... + 1
,也就是O(n²)。
for i in range(0, n):
for j in range(i, n):
print(i*j)
- 在外循环的第一次迭代中,内循环执行n次操作。
- 第二个,n-1次操作。
- 第三个,n-2次操作
- ...等等,直到内循环只进行 1 次迭代。
n + n-1 + n-2 + ... + 1 = O(n^2),乘法从何而来?
请注意,从学究意义上讲,O(n^2) 也是 O(n!)。也就是说,O(n!) 包括 O(n^2)(然后是一些)的函数。
我也是新来的。根据我的理解,我认为
for i in range(0,n) -> n 次 对于范围 (i,n) 中的 j -> n-i 次
因为只有 2 个循环,这意味着 n * (n-i) 用于整个操作。它应该只是 O(n^2).