算法复杂度O(nlogn)详解

首先看以下程序段:

for(int i=1;i<=n;i++)

{

          for(int j=1;j<=n;j+=i)

           {

                   .....   //复杂度为O(1);

            }

}

求该程序段的时间复杂度。

可以看出:(1)当i=1时,需要执行n次;

                     (2)当i=2时,需要执行n/2次;

                      (3)当i=3时,需要执行n/3次;

                                .............

                      (4)当i=n-1时,需要执行n/n-1次;

                      (5)当i=n时,需要执行n/n次;

每次的时间复杂度为O(1),则总共的时间复杂度为n(1 +1/2+1/3 +1/4 + 1/5+ 1/6+1/7+1/8 +...1/n)。

1 +1/2+1/3 +1/4 + 1/5+ 1/6+1/7+1/8 +...1/n是一个调和级数。很早就有数学家研究,比如中世纪后期的数学家Oresme在1360年就证明了这个级数是发散的。Euler(欧拉)在1734年,利用Newton的成果,首先获得了这个调和级数有限多项和的值。

1+1/2+1/3+1/4+...+1/n= ln(n+1)+r(r为常量)

他的证明是这样的:
根据Newton的幂级数有:
ln(1+1/x) = 1/x - 1/2x^2 + 1/3x^3 - ...
于是:
1/x = ln((x+1)/x) + 1/2x^2 - 1/3x^3 + ...
代入x=1,2,...,n,就给出:
1/1 = ln(2) + 1/2 - 1/3 + 1/4 -1/5 + ...
1/2 = ln(3/2) + 1/2*4 - 1/3*8 + 1/4*16 - ...
......
1/n = ln((n+1)/n) + 1/2n^2 - 1/3n^3 + ...
相加,就得到:
1+1/2+1/3+1/4+...1/n = ln(n+1) + 1/2*(1+1/4+1/9+...+1/n^2) - 1/3*(1+1/8+1/27+...+1/n^3) + ......
后面那一串和都是收敛的,我们可以定义
1+1/2+1/3+1/4+...1/n = ln(n+1) + r
Euler近似地计算了r的值,约为0.5772156649。这个数字就是后来称作的 欧拉常数
回归到程序本身:

则总共的时间复杂度为:

n(1 +1/2+1/3 +1/4 + 1/5+ 1/6+1/7+1/8 +...1/n)

=n(ln(n+1) + r)

=nln(n+1)+rn

因此该程序段的时间复杂度为O(nlogn).

  • 32
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值