两段代码的时间复杂度

时间:2013-12-26 10:24:08

标签: java time-complexity

我们有两段代码:

int a = 3; 
while (a <= n) {
    a = a * a;
}

public void foo(int n, int m) { 
    int i = m; 
    while (i > 100) 
        i = i / 3; 
    for (int k = i ; k >= 0; k--) { 
        for (int j = 1; j < n; j*=2) 
            System.out.print(k + "\t" + j); 
        System.out.println(); 
    } 
}

他们的时间复杂度是多少? 我认为第一个是:O(logn),因为它以2的幂进展到N.
那么也许它是O(log 2 n)?

我相信的第二个是:O(nlog2n),因为它正在以2的跳跃进行,并且还在外部循环上运行。

我是对的吗?

2 个答案:

答案 0 :(得分:5)

我相信,第一个代码将在O(Log(LogN))时间内运行。用这种方式理解很简单

  1. 在第一次迭代之前,你有3个力量1
  2. 第一次迭代后你有3个力量2
  3. 第二次迭代后你有3个力量4
  4. 在第三次迭代后,你有3个力量8
  5. 在第四次迭代后,你有3个力量16 等等。
  6. 在第二个代码中,第一段代码将在O(LogM)时间内工作,因为每次将i除以3。第二段代码C次(在你的情况下C等于100)将执行O(LogN)操作,因为你每次将j乘以2,所以它在O(CLogN)中运行,并且你有复杂度O(LogM + CLogN) )

答案 1 :(得分:4)

对于第一个,它确实是O(log(log(n)))。感谢@MarounMaroun提示,我可以找到:

l(k) = l(k-1)^2
l(0) = 3

解决此系统会产生:

l(k) = 3^(2^k)

因此,我们正在寻找满足k的{​​{1}}。所以简单地解决这个问题:

enter image description here

这意味着我们找到了:

enter image description here

第二个代码似乎有误导性。它看起来像O(n log(n)),但外部循环限制为100.因此,如果l(k) = n,那么它显然是O(m log(n))。否则,它取决于m的确切位置。考虑这两个:

  • m:m < 100
  • m:305 -> 101 -> 33

在第一种情况下,外环将运行33次。而第二种情况会导致100次迭代。我不确定,但我认为你可以把它写成O(log(n))。