我需要一种时间复杂度小于O(n)的算法。
目前我有这个算法:
int n;
sum=n;
for(int i=2;i<=n;i++)
{
sum+=n/i;
}
答案 0 :(得分:2)
那是n *(1/1 + 1/2 + 1/3 + 1/4 + .. + 1 / n)
后一个和是n次谐波数,并且具有相对较好的approximation。
使用较大的n
进行检查,看看它是否足够精确 - 显然对于小n
只需使用“算法”或查找表。
import math
euler=0.5772156649015
sum=0
show=10
for i in range(1,1000001):
sum += 1.0/i
if i == show:
approx = math.log(i) + euler + 1.0/(2*i)
print "%7d %.2e" % (i, approx - sum)
show *= 10
10 8.33e-04
100 8.33e-06
1000 8.33e-08
10000 8.33e-10
100000 8.45e-12
1000000 9.93e-13