如何在小于O(n)的时间内计算和n + n / 2 + n / 3 + n / 4 ........ +(n / n)?

时间:2013-09-10 07:35:31

标签: algorithm series

我需要一种时间复杂度小于O(n)的算法。

目前我有这个算法:

int n; sum=n; for(int i=2;i<=n;i++) { sum+=n/i; }

1 个答案:

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