算法时间复杂度详细分析(由简入难)

for(i=0;i<n;i++) 
 for(j=1,sum=a[0];j<=i;j++) 
 sum+=a[j];

首先这是一个嵌套循环,外层循环先做了  i=0;一次赋值操作,算做  +1,i从0到n-1,一共进行了

(n-1)-0+1次操作,即n次++操作,算作  +n,  外层每循环一次,内层就会执行j=1,sum=a[0];这两项赋值操作就会执行   2*n次,因为内层循环的上限不是n,而是 i,即对于外层n次循环,每次内存只能达到 i,内存执行一次,就会有j++;sum+=a[j];两次操作所以进行2*(1+2+3+....+n-1)次(提示:i最大就是n-1),综上进行

1+n+2n+2(1+2+3+...+n-1)=n^2+2n+1=O(n^2)

我们知道了分析之后,再来看这个问题就很容易了,开始的 i 赋值肯定是有一次的,外层i++,和 内层 j=1,sum=a[0],就是3n次(关于j和sum可以看成外层n次循环下的第一级操作),j++,和sum+=a[j];两次操作(可以看出外层n次循环下的第二级操作)要注意内循环上限是 i,就知道内循环了(1+2+3+4+...+n-1),所以最终执行赋值操作   2*(1+2+3+...+n-1)次   (对j和sum的操作)

当然你如果只想知道O(n^2),那么就不需要分析低数量级的操作,不过知道具体的细节肯定是有好处的。

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

总体来看这段代码, 先 i赋值 算1次,i++;  算n次内循环要注意int j=1;是变量初始化,不是赋值操作,(之前困扰了我,上网查了一下)所以确切的来说不能算 n次,

j的上限是n ,但是步长在变,是 i,j从1到 n,步长是i ,取整约进行了 n/i  次

所以是    1+n+(n/1+n/2+n/3+.....+n/n)=O(nlogn)

 

要是想要证明:

最后1+In(n)<logn, 两边同时乘n,即得到相应的结果

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大肥羊学校懒羊羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值