Algorithm θ中从1到n的和(对数n)
有没有办法计算θ(logn)中1到n的和 当然,最明显的方法是sum=n*(n+1)/2 然而,为了练习,我想计算θ(logn) 比如说,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 ^(
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