【问题标题】:O(n log log n) time complexityO(n log log n) 时间复杂度
【发布时间】:2011-07-09 05:32:54
【问题描述】:

我这里有一个小程序:

Given any n:
i = 0;
while (i < n) {
   k = 2;
   while (k < n) {
        sum += a[j] * b[k]
        k = k * k;
   }
   i++;
}

这个的渐近运行时间是O(n log log n)。为什么会这样?我知道整个程序至少会运行 n 次。但我不确定如何找到 log log n。内循环取决于 k * k,所以它显然会小于 n。如果每次都是 k / 2,它只会是 n log n。但是你怎么知道log log n的答案呢?

【问题讨论】:

标签: algorithm logarithm


【解决方案1】:

对于数学证明,内循环可以写成:

T(n) = T(sqrt(n)) + 1

w.l.o.g assume 2 ^ 2 ^ (t-1)<= n <= 2 ^ (2 ^ t)=>
we know  2^2^t = 2^2^(t-1) * 2^2^(t-1)
T(2^2^t) = T(2^2^(t-1)) + 1=T(2^2^(t-2)) + 2 =....= T(2^2^0) + t =>
T(2^2^(t-1)) <= T(n) <= T(2^2^t) = T(2^2^0) + log log 2^2^t = O(1) + loglogn

==> O(1) + (loglogn) - 1 <= T(n) <= O(1) + loglog(n) => T(n) = Teta(loglogn).

然后总时间为 O(n loglogn)。

为什么内循环是 T(n)=T(sqrt(n)) +1? 首先看内循环何时中断,当k>n时,表示在k之前至少为sqrt(n),或者在最多为sqrt(n)之前的两级,所以运行时间为T(sqrt(n)) + 2 ≥ T(n) ≥ T(sqrt(n)) + 1。

【讨论】:

  • @Tymek,我更新了答案,希望对您有所帮助,但请注意,内循环不是 sqrt(n) + 1,我证明内循环是 log log n,我在内循环中说过我们有T(n) = T(sqrt(n)) + 1
【解决方案2】:

如果循环变量以恒定的量以指数方式减少/增加,则循环的时间复杂度为 O(log log n)。如果循环变量除以/乘以一个常数,则复杂度为 O(Logn)。

例如:在您的情况下, k 的值如下。让括号中的 i 表示循环已执行的次数。

 2 (0) , 2^2 (1), 2^4 (2), 2^8 (3), 2^16(4), 2^32 (5) , 2^ 64 (6) ...... till n (k) is reached. 
The value of k here will be O(log log n) which is the number of times the loop has executed.

为了假设,我们假设n2^64。现在log (2^64) = 64log 64 = log (2^6) = 6. 因此当n2^64 时,您的程序运行6 次。

【讨论】:

    【解决方案3】:

    我想如果代码是这样的话,应该是n*log n;

    i = 0;
    while (i < n) {
        k = 2;
        while (k < n) {
            sum += a[j] * b[k]
            k *= c;// c is a constant bigger than 1 and less than k;
        }
    i++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2011-12-12
      • 2015-05-25
      • 1970-01-01
      • 2015-09-21
      相关资源
      最近更新 更多