无论如何计算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)中计算。
答案 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