Algorithm θ中从1到n的和(对数n)

Algorithm θ中从1到n的和(对数n),algorithm,Algorithm,有没有办法计算θ(logn)中1到n的和 当然,最明显的方法是sum=n*(n+1)/2 然而,为了练习,我想计算θ(logn) 比如说, sum=0; for(int i=1; i<=n; i++) { sum += i} sum=0;对于(inti=1;ifairway(不使用数学公式)来说,假设所有n个值直接求和,因此无法避免O(n)行为 如果你想用一些“强”人工< /强>方法来提供精确的O(log(n))时间,考虑例如使用两个幂(知道和(1…2 ^ k=2 ^(k-1)+2 ^(

有没有办法计算θ(logn)中1到n的和

当然,最明显的方法是sum=n*(n+1)/2

然而,为了练习,我想计算θ(logn)

比如说,

sum=0; for(int i=1; i<=n; i++) { sum += i}
sum=0;对于(inti=1;ifairway(不使用数学公式)来说,假设所有n个值直接求和,因此无法避免O(n)行为

如果你想用一些“强”人工< /强>方法来提供精确的O(log(n))时间,考虑例如使用两个幂(知道<代码>和(1…2 ^ k=2 ^(k-1)+2 ^(2×k-1)< /代码> -例如,代码>求和(8)=4+32</代码>)。Pseudocode:

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
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