如何计算出算法的复杂性?

时间:2017-11-15 14:11:56

标签: complexity-theory analysis

我有两个问题用于算法分析,并想知道如何确定以下两个的复杂性:

首先:

For(int i=2; i<n; i=i*i*i)
{
  //something O(1)
}

第二

n/1 + n/2 + n/3 +...+ n/n

2 个答案:

答案 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))