时间复杂度计算

#时间复杂度
定义:算法中基本操作的执行次数作为时间复杂度的度量
步骤:
1.找到算法中的基本操作
2.计算基本操作重复执行的次数m,即求一个执行次数为 n(n<=输入规模)的函数f(n)= m
3.取出f(n)中随n增大而增大最快的项(指数最大的项),然后将其系数置为1,T(n) = O(f(n))

######这里解释一下为什么是计算函数f(n),和将系数置为1
算法的渐近分析不是从时间上度量算法的运行效率,而是度量算法运行时间的增长趋势
即,在输入规模充分大时,算法的基本语句执行次数在渐近意义下的
换句话说就是在输入规模大于n0时,执行次数的上界
这里写图片描述
对于任意n>=n0,都有T(n)<=cf(n),则T(n) = O(f(n))
根据上图可知,对于输入规模大于n0,只要T(n)无限接近c
f(n)就行,c是系数,f(n)不唯一,
但对T(n)影响较大的就是f(n)的最高阶
常见复杂度
这里写图片描述


举个栗子:

void func(int n){
	int i = 1,j = 100;
	while(i < n){
		++j;
		i+=2;
	}
}

1.基本操作:++j,i+=2。大多数情况下最深的循环内的语句是基本操作
2.确定输入规模n
3.确定f(n),
假设循环执行m次,i = 1 + 2m,由于循环结束时i>n,所以设1+2m+x = n,f(n) = m =(n-1-x)/2
所以T(n)=O(n)

for(i=1;i<=n;i++)//循环了(n+n-1+n-2+...+1)≈(n^2)/2=>O(n^2)
    for(j=i;j<=n;j++)
        s++;
for(i=1;i<=n;i++)//循环了(1+2+3+...+n)≈(n^2)/2,当然也是O(n^2)
    for(j=1;j<=i;j++)
        s++;

###递归算法的时间复杂度分析
$T(n)=
$$2 , n=0\brace T(n-1)+2,n>0
$, 当n=2^k,T(n)=?

T(n) = T(n-1) +2
     = (T(n-2)+2)+2
     = ((T(n-3)+2)+2)+2
     ...
     =T(n-n) + 2+2+...+2 (n个2)
     =T(0)+2n
     =2+2n
     =O(n)
     必须化为n的函数,不要有k
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

siyan985

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

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

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

打赏作者

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

抵扣说明:

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

余额充值