时间复杂度和空间复杂度
来源:互联网 发布:网络歌曲想问问你 编辑:程序博客网 时间:2024/05/17 08:06
一.什么是时间复杂度呢?
解析:时间复杂度其实就是函数,函数计算执行的 基本操作次数。(这里的函数是指数学里面的函数,而不是C语法里的函数)
为什么时间复杂度不是计算执行的实践而是次数呢?
解析:因为我们无法计算执行的时间,比如不同的机器不同的配置,同一个算法的运行时间都是不一样的。所以我们只能在这里计算执行的次数来表示算法的性能。
首先来看一个简单的例子:
二.算法分析的分类
1.最坏情况:任意输入规模的最大运行时间(上界)
2.平均情况:任意输入规模的期望运行实践。
3.最好情况:任意输入规模的最小运行实践,通常好的情况不会出现。(下界)
例如:在一个长度为N的线性表中搜索一个数据X
最坏情况:比较N次
平均情况:比较N/2次
最好情况:比较1次
注意:在实际中我们通常情况考量的是算法的最坏的运行情况。也就是说对于任意规模的N,算法的最长运行时间。理由如下:
1.一个算法的最坏情况的运行时间是在任意输入下的运行时间的上界。
2.对于某些算法,最坏的情况出现的较为频繁
3.大体上看,平均的情况与最坏的情况一样差
算法分析要保持大局观:
1.忽略掉那些的常数
2.关注运行实践的增长趋势,关注函数式中增长最快的表达式。
三.O的渐进表示法(Big O Notation)
通常我们使用O记号法表示最坏运行情况的渐进上界。其实也就是说我们使用O标记法表示时间复杂度,一般情况关注的是算法的运行最坏的情况。
为什么关注的是最坏的情况呢,我们以上图中的F(N)=N^2+2*N+10说明:
所以这个算法的实践复杂度就是:O(N^2)
下面我们使用大O渐进表示法计算下面函数的时间复杂度
1.f(N)=N^3+N^2+N+1000,只需要关注N^3,所以O(N^3)
2.F(N)=10000*N*N+2*N+10,所以O(1000*N*N),实际是O(N^2),因为我们要忽略一些常数,看起来1000对执行结果也很有影响,不过当N足够大的时候10000就显得微不足道,可以忽略了,所以只要是常识就忽略掉
3.F(M,N)=2M+N---->:O(M+N)
4.F(M,N)=M*N----->O(M*N)
接下来我们深入了解:
1.二分查找的时间复杂度:
2.递归算法的时间复杂度:递归次数*递归每次走的次数
四.空间复杂度
解析:空间复杂度的计算和时间复杂度类似,也使用大O的渐进表示法。(开辟对象的个数,不是累积的个数)
要注意的是递归算法的空间复杂度,假如递归深度为N*每次递归的空间大小,如果每次递归的空间为常数,则空间复杂度为O(N)
首先我们来看:以斐波那契数列的时间复杂度和空间复杂度
总结来看就是如下公式:
代码实现如下:
int fib(int N){return N > 1 ? fib(n - 1) + fib(n - 2) : N;}
其时间复杂度和空间复杂度在下面图示中。
例: 1.
+、
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 上层应用开发是否真的没有底层开发有前途?
- 默认构造函数和构造函数重载
- 一款基于ijkplayer框架的音乐播放器(已开源)
- 搭建lnmp环境(nginx1.9.15-源码)
- php设计模式-工厂模式
- 时间复杂度和空间复杂度
- 搭建lnmp环境(php7.1.8-源码)
- codevs 1282 约瑟夫问题 大暴力? 解题报告
- 搭建lnmp环境(mysql5.7-yum)
- 支持向量机(一)——线性可分支持向量机
- bzoj1025 [SCOI2009]游戏(置换+分组背包)
- JSP(1)—基础知识
- 销售罗盘,这家无法定义的公司究竟在干什么事?
- 任正非:从未想干翻苹果|用友云SaaS产品“云直播”上市 |【软件网每日新闻播报│第9-28期】