我有两个问题用于算法分析,并想知道如何确定以下两个的复杂性:
首先:
For(int i=2; i<n; i=i*i*i)
{
//something O(1)
}
第二
n/1 + n/2 + n/3 +...+ n/n
答案 0 :(得分:1)
到第一个:
它将是无限的,因为1*1*1 = 1
所以我总是1,永远不会是>= n
。
第二种算法实际上不是一种算法,但加法运行在O(n)
。
答案 1 :(得分:1)
对于第一个算法:
假设i
的初始值为2(而不是1,这将导致@tschaefemedia评论的无限循环)。
在第一次迭代中,i == 2
在第二次迭代中,i == 2 * 2 * 2 == 23
在第三次迭代中,i ==(23 * 23 * 23)== 2(3 * 3)
在第四次迭代中,i == 2(3 * 3)* 2(3 * 3)* 2(3 * 3)== 2(3 * 3 * 3)
...
在迭代k + 1,i == 2(3 * 3 * 3 * ... * 3)== 2(3k)
为简单起见,假设在迭代k-1,i变为等于n并且循环停止。然后:
n == 2(3k)
log2(n)== 3 ^ k
log3(log2(n))== k
因此,复杂度为O(log3(log2(n)))
至于第二个问题,我想你正在给出复杂性公式。所以,
n / 1 + n / 2 + n / 3 + ... + n / n = n(1 + 1/2 + 1/3 + ... + 1 / n)
这是Harmonic系列,它是O(log(n))
因此,总体复杂度为O(n * log(n))