theta(log n)中从1到n的总和

时间:2018-03-26 04:25:13

标签: algorithm

无论如何计算Theta(log n)中1到n的总和?

当然,显而易见的方法是sum = n *(n + 1)/ 2。

但是,练习时,我想用Theta(log n)计算。

例如,

sum=0; for(int i=1; i<=n; i++) { sum += i}

此代码将在Theta(n)中计算。

1 个答案:

答案 0 :(得分:0)

公平的方式(不使用数学公式)假设直接求和所有n个值,因此无法避免O(n)行为。

如果你想制作一些人工方法来提供准确的O(log(N))时间,可以考虑使用2的幂(知道Sum(1..2^k = 2^(k-1) + 2^(2*k-1) - 例如,Sum(8) = 4 + 32)。伪代码:

function Sum(n)
   if n < 2 
       return n
   p = 1     //2^(k-1)
   p2 = 2    //2^(2*k-1)
   while p * 4 < n:
      p = p * 2;
      p2 = p2 * 4;
   return p + p2 +                    ///sum of 1..2^k
         2 * p * (n - 2 * p) +        ///(n - 2 * p) summands over 2^k include 2^k
         Sum(n - 2 * p)               ///sum of the rest over 2^k

此处2*p = 2^k是两个不超过N的最大幂。例如:

Sum(7) = Sum(4) + 5 + 6 + 7 = 
         Sum(4) + (4 + 1) + (4 + 2) + (4 + 3) = 
         Sum(4) + 3 * 4 + Sum(3) = 
         Sum(4) + 3 * 4 + Sum(2) + 1 * 2 + Sum(1) = 
         Sum(4) + 3 * 4 + Sum(2) + 1 * 2 + Sum(1) = 
         2 + 8  +   12   + 1 + 2 +   2 +     1 = 28