时间复杂度和空间复杂度详解

目录:

一、前言

二、什么是算法

三、时间复杂度

四、空间复杂度

一、前言

在了解时间复杂度和空间复杂度之前,我们需要知道这两个东西的用处,时间复杂度和空间复杂度是用来衡量一个算法的好坏,那这里就引出了新的名词:算法。首先我们了解一下算法是什么。

二、什么是算法

算法是对特定问题求解步骤的一种描述,比如求等差数列1-100的和,那用首项加末项的和乘以项数除以二,这是等差的数列求和的公式,也就可以理解成是一种算法。

一个算法具有五个重要特性:

1.有穷性   一个算法执行时要求有限的时间和步数内能完成。

2.确定性  算法中每条指令要有明确的意思,在相同的输入下必须是相同的输出,否则不是算法。

3.可行性  算法描述的操作是可以用有限的基本运算来实现的。

4.输入

5.输出

了解了算法是什么,我们还需要知道,一个好的算法需要哪些标准:

1.正确性  在解决问题的时候,我们使用算法,求出的结果要是正确的,否则不符合正确性,不是                  一个好的算法。

2.可读性  在写算法的时候,可以在每行加上注释,来使别人读你的算法的时候,可以更好的理                      解,如果你的算法可读性不好,别人看见后很难理解你的算法,那就缺乏了可读性。

3.健壮性  一个算法要是可以处理各种bug的,在面对非法输入的时候,可以做出反应或者处理,                    比如使用assert函数来完善算法。

4.高效率与低存储量需求  高效率也就是指的时间复杂度,效率高代表时间越快,低存储量指的就                                           是空间复杂度,占用越低越好,在现在科技高速发展,可以牺牲空间效                                           率的方式来换取更好的时间效率!

三、时间复杂度

了解算法以后,我们开始学习时间复杂度。

时间复杂度是一个函数,算法中的基本操作的执行次数,为算法的时间复杂度,即:找到某条语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。一般情况下,看循环次数或者递归次数。

我们来看一道例题进行理解:

时间复杂度和空间复杂度详解_第1张图片

这里我们可以看循环次数,也就是2*N+M次,规范表达,我们要用符号O() , 也就是O(2*N+M) , 这里M是10,N是一个未知数,那这个可以写成O(2*N+10),这个表达式是需要进一步简化的,这里引入大O渐进表示法。

大O符号:是用于描述函数渐进行为的数学符号。

这里有以下规定:

1、用常数1取代运行时间中的所有加法常数

2 、在修改后的运行次数函数中, 只保留最高阶项
3 、如果最高阶项存在且不是 1 ,则去除与这个项目相乘的常数。得到的结果就是大 O 阶。
根据以上规则,我们首先利用2,将10去掉,在利用3,将2去掉,因为在N很大的时候,10,2这种常数对于N的影响太小了,可以忽略不计!
最终我们得到上一题的答案为O(N).
一般算法常见的复杂度如下:
时间复杂度和空间复杂度详解_第2张图片
那各个复杂度的对比图如下:
时间复杂度和空间复杂度详解_第3张图片
也就是O(1) < O(log2(n)) < O(n) < O(nog2(n)) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
有一个口诀:常对幂指阶 。 
代表 常数 < 对数 < 幂 < 指数 < 阶乘
注:一般总是考虑最坏情况下的时间复杂度
四、空间复杂度
 空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。
空间复杂度算的是变量的个数。
空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。 

来看一道题:

时间复杂度和空间复杂度详解_第4张图片

这里用来递归,N调用了N-1、N-2, N-1调用了N-2、N-3 ,以此类推,一共开辟了                    N、N-1、N-2、N-3 —— 3、2、1 , 那么它的空间复杂度就是N,也就是O(N).

你可能感兴趣的:(数据结构)