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]
aO(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;ifor(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