Algorithm 寻找嵌套循环的复杂性

Algorithm 寻找嵌套循环的复杂性,algorithm,math,Algorithm,Math,所以我有一个非常复杂的嵌套循环,我需要找到它的复杂性。代码如下: 1。int c=0; 2.对于(int i=1;i第4行: i is O(n). j is O(n). Therefore, i+j is O(n). Having a constant step of 3, making (i+j)/3 steps, is O(n). This inner loop will run for n*n*k iterations, where k is the summation of ce

所以我有一个非常复杂的嵌套循环,我需要找到它的复杂性。代码如下:

1。int c=0;
2.对于(int i=1;i第4行:

i is O(n).
j is O(n).
Therefore, i+j is O(n).
Having a constant step of 3, making (i+j)/3 steps, is O(n).
This inner loop will run for n*n*k iterations, where
    k is the summation of ceil[(i+j)3] over their ranges.
    k will be roughly (n+2)/3.
第5行:

Increment is O(1).

这将完成您的推导。

程序对每个
(i,j)执行∈ [n] X[n]
a
O(i+j)
操作。
我们可以说这是一个
O(i)
操作,然后是
O(j)
操作,复杂性保持不变。

因此,对于每个
i
我们做
O(n*i)
[对于每个
j
n
),我们做
O(i)
]和
O(1+2+…+n)=O(n^2)
。显然,
O(n*i)+O(n^2)=O(n^2)
,我们总共做了
n次
O(n^3).

我们可以从数学上证明复杂性。总迭代次数可以表示为(遗憾的是,不支持latex)

如果您绘制
i
j
值及其总和
i+j
的网格,您也可以看到这一点

这相当于

sum_j=1^n {[n(n + 1)/2 + nj] / 3}
可以进一步简化为

{n[n(n + 1)/2] + n[n(n + 1)/2] / 3}
经过评估得出

(n^3 + n^2) / 3
这是顺序
O(n^3)

步骤为1而不是3的迭代次数可以通过编程进行验证(Python代码)

c=0
n=4#改变n进行测试,缓慢
对于范围(1,n+1)内的i:
对于范围(1,n+1)内的j:
对于范围(1,i+j+1)内的k:
c+=1
断言(c==(n**3+n**2))

因为我们唯一关心的是O的复杂性,只要我们在恒定因素内,这一点就可以改变:

1)
k++=3
=>
k++
以[1,3]之间的常数因子更改运行时


2)
for(inti=1;i
for(inti=n/2;我不应该为n(n-1)(2n/3)运行第k个循环)?因为第j个循环运行(n-1)次对吗?(1)这种差异不影响计算复杂性;(2)不,
i
j
具有相同的迭代限制。如果这是真的,那么对于n=5,c的值是83(从n*n*(2n/3)).但是当我运行代码时,c的值是58。你能告诉我我遗漏了什么吗?你遗漏了我犯了一个计算错误。调整我的答案…最重要的是,你为什么要担心
c
的确切值?你的问题是关于计算复杂性,这是时间增量的限制ase作为
n
的函数,
c
是一个合理的时间度量,但小
n
的特定值不会损失研究时间。也就是说,将迭代次数除以3并不完全“正确”因为它更多的是一个
floor
函数,但我的数学无法处理。如果这是真的,那么对于n=5,c的值是100。但是当我运行代码时,c的值是58。你能告诉我我遗漏了什么吗?@ppaloo你的代码以3步一步的方式运行
k
。“证明”程序是为
k
一步一步编写的,因为
i+j
之和永远不可能是3的完美倍数。很难用一个底函数构造一个精确的数学证明。@ppaloo反正对于
n=5
来说
c
的值是150而不是100。进一步考虑,它可能是相反,
c
不精确的原因是一样的。你只能估计。
{n[n(n + 1)/2] + n[n(n + 1)/2] / 3}
(n^3 + n^2) / 3