时间复杂度与空间复杂度区分

时间复杂度与空间复杂度

1. 分析普通情况下的时间复杂度/空间复杂度

2. 分析二分查找、递归实现的斐波那契数列的时间/空间复杂度

1.时间复杂度:

时间复杂度即使算法执行次数n的某个函数f(n),进而分析f(n)随n的变化情况并确定T(n)的数量级。这里用”O”来表示数量级

时间复杂度的表达式为: T(n)=O(f(n))

它表示随着问题规模的n的增大,算法的执行时间的增长率和f(n)的增长率相同,这称作算法的渐进时间复杂度,简称时间复杂度。而我们一般讨论的是最坏时间复杂度,这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,分析最坏的情况以估算算法指向时间的一个上界。

时间复杂度的分析方法:

1)时间复杂度就是函数中基本操作所执行的次数

2)一般默认的是最坏时间复杂度,即分析最坏情况下所能执行的次数

3)忽略掉常数项

4)关注运行时间的增长趋势,关注函数式中增长最快的表达式,忽略系数

5)计算时间复杂度是估算随着n的增长函数执行次数的增长趋势

6)递归算法的时间复杂度为:递归总次数 * 每次递归中基本操作所执行的次数

2. 空间复杂度:

算法的空间复杂度不计算实际占用的空间,而是算整个算法的“辅助空间单元的个数”,与问题的规模没有关系。算法的空间复杂度S(n)定义为该算法所耗费空间的数量级。

S(n)=O(f(n)) 若算法执行时所需要的辅助空间相对于输入数据量n而言是一个常数,则称这个算法的辅助空间为O(1)

递归算法的空间复杂度:递归深度N*每次递归所要的辅助空间, 如果每次递归所需的辅助空间是常数,则递归的空间复杂度是 O(N)

3.二分查找的时间空间复杂度

首先了解二分查找,首先在长度为n的表范围中查找,第一次循环在n/2中查找,第二次在n/2/2中查找,依次循环。假设在第X次找到,那么 就是找2的X次方次,有2的X次方=n解出x为log2的n ,故时间复杂度为log2N。由于辅助空间是常数级别的所以:空间复杂度是O(1)

这里写图片描述

4.递归实现斐波那契数列的时间空间复杂的

首先了解什么是斐波那契数列,就是这样一组数 1 1 2 3 5 8 13…,前两个数为1后面的数依次为其前两个的和

递归实现的算法为

long long Fib(int n)

{

   assert(n >= 0);  

   return n<2 ? n : Fib(n - 1) + Fib(n-2);  

}

这里写图片描述

将递归执行图画出来可以明显的看出来,这是一颗二叉树,无论他是否是满二叉树,因为我们前面说过我们只计算最坏的情况,所以要计算这课二叉树有多少个元素,数的深度为n,那么元素为2^N-1;去掉常数项就是2的n次方

时间复杂度的分析:菲波那切数也可以看做一个数结构,1分为2, 2分为4, 4分为8,…而要去求第n个斐波那契数,就需要被分解成2^n-1个数字,也就是需要执行2^n-1次,用大O表示法记为O(2^n)。

递归的时间复杂度是: 递归次数*每次递归中执行基本操作的次数

所以时间复杂度是: O(2^N) (共执行多少次)

递归的空间复杂度是: 递归的深度*每次递归所需的辅助空间的个数

所以空间复杂度是:O(N) ( 递归一次要开辟一个空间)

**我们看一个例子
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
// do …..
}
}**
当 i = 0 时 里面的fo循环执行了n次,当i等待1时里面的for循环执行了n - 1次,当i 等于2里里面的fro执行了n - 2次……..所以执行的次数是
这里写图片描述

根据我们上边的时间复杂度算法
1.去掉运行时间中的所有加法常数: 加法常数不用考虑
2.只保留最高阶项: 只保留 n^2/2
3. 去掉与这个最高阶相乘的常数: 去掉 1/2 只剩下 n^2
最终这个算法的时间复杂度为 o(n^2)

再看一个线性的
for ( int i = 0; i < n; i++) {
// do …..
}
因为循环要执行n次所以时间复杂度为O(n)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值