对嵌套嵌套的循环可能同时为O(n!)和O(n ^ 2)感到困惑

时间:2020-10-09 11:37:20

标签: python for-loop big-o

假设有一个简单的嵌套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表示,更糟的是?

3 个答案:

答案 0 :(得分:4)

该计算应为n + n-1 + n-2 ... + 1,即O(n²)。

答案 1 :(得分:2)

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)(然后是一些)。

答案 2 :(得分:0)

我也是新来的。根据我的理解,我认为

对于范围在(0,n)-> n的i 对于范围(i,n)-> n-i次的j

因为只有2个循环,对于整个操作而言,这意味着n *(n-i)。应该只有O(n ^ 2)。