Algorithm O(n log n)时间复杂度

Algorithm O(n log n)时间复杂度,algorithm,logarithm,Algorithm,Logarithm,我这里有一个简短的计划: Given any n: i = 0; while (i < n) { k = 2; while (k < n) { sum += a[j] * b[k] k = k * k; } i++; } 给定任意n: i=0; 而(i

我这里有一个简短的计划:

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

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

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

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).
T(n)=T(sqrt(n))+1
w、 l.o.g假设2^2^(t-1)

T(2^2^(T-1))如果循环变量以指数方式减少/增加常量,则循环的时间复杂度为O(logn)。如果循环变量除以/乘以常量,则复杂度为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.

为了便于假设,让我们假设
n
2^64
。现在
log(2^64)=64
log 64=log(2^6)=6。因此,当
n
2^64
时,程序运行
6次

我认为如果代码是这样的,它应该是n*logn

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++;
}
i=0;
而(i
@Tymek,我更新了答案,希望这有帮助,但要小心,内环不是sqrt(n)+1,我证明了内环是
log log n
,我在内环中说我们有
T(n)=T(sqrt(n))+1
。要更详细地解释为什么,这里有一个问题需要寻找: