您的位置:首页 > 其它

时间复杂度和空间复杂度

2017-09-29 08:17 211 查看
一.什么是时间复杂度呢?

解析:时间复杂度其实就是函数,函数计算执行的 基本操作次数。(这里的函数是指数学里面的函数,而不是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.


+、

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息