考研数据结构笔记(1) 时间复杂度和空间复杂度

考研数据结构笔记(1) 时间复杂度和空间复杂度

    • 开篇语
    • 总述
    • 时间复杂度:
    • 空间复杂度
    • 另外一点
    • 参考书籍

开篇语

博主大三考研狗一枚,最近要提前准备下数据结构复习,所以写一系列关于复习数据结构知识的博文,以总结和提升自己在数据结构这一块学习过程中遇到的问题。同时,博客会及时更新和完善,如果诸位有不同意见之处,请在评论区提出,我会及时采纳和更正。

总述

先用一张图对数据结构做一个概括:
考研数据结构笔记(1) 时间复杂度和空间复杂度_第1张图片
接下来是对算法和算法分析的概括:
在这里插入图片描述
考研数据结构笔记(1) 时间复杂度和空间复杂度_第2张图片
重点总结下时间复杂度和空间复杂度:

时间复杂度:

问题规模的引入:不考虑计算机的软硬件等环境因素,影响算法时间代价的最主要因素是问题规模,也就是问题输入量的多少,或者说传入函数中参数n的大小。而问题规模n对不同问题含义不同,例如:排序运算中n为参加排序的记录个数;矩阵运算中n为矩阵的阶数;在树有关运算中n为树的结点个数;在图的运算中n为图的顶点数或边数。而n的大小则与算法的执行时间成正比。而所谓的算法分析也并非精确统计算法实际执行所需时间,而是针对算法中语句的执行次数做出估计,从中得到算法执行时间的大小。
一般来说,分析算法时间复杂度的基本方法为:找出所有语句中执行次数最多的语句(语频最大)作为基本语句进行分析,最后得到问题规模n的某个函数f(n),其数量级用“O“表示。
求非递归算法的时间复杂度举例
常数阶:算法的执行时间是一个与问题规模n无关的常数,即使n再大,算法的时间复杂度也为T(n)= O(1)
幂数阶:语句执行次数是关于n的幂函数,即f(n)=n的一次方、二次方等等,一般来说就是分几层循环来执行语句,比如:

int x=0;
int y=0; 
for(int i=l; i<=n;i++) 
     x++;     //一次阶
for(int i=l ; i <=n;i++) 
     for(j=l;j<=n;j++) 
         y++;  //二次阶
         

对数阶:语句执行次数是关于n的对数,一般题目中底数都是2。例如:

for(int i=l; i<=n; i=i*2) 
{
   x++;
   s=0;
}

从代码中可以看出求循环执行次数f(n)的方程为2的f(n)次方等于n,所有得出f(n)<=log2n,所有算法时间复杂度为O(n)= log2n。
常见时间复杂度按数量级排序
在这里插入图片描述
助记图:
考研数据结构笔记(1) 时间复杂度和空间复杂度_第3张图片
最好最坏和平均时间复杂度
称算法在最好情况下的时间复杂度为最好时间复杂度,指的是算法计算量可能达到的最小值,也就是在查找时可以最少次满足条件去执行语句;称算法在最坏情况下的时间复杂度为最坏时间复杂度,指的是算法计算量可能达到的最大值,也就是在查找时可以最多次满足条件去执行语句;算法的平均时间复杂度是指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值。对算法时间复杂度的度量,人们更关心的是最坏情况下和平均情况下的时间复杂度。然而在很多情况下,算法的平均时间复杂度很难确定。因此,通常只讨论算法在最坏情况下的时间复杂度。

空间复杂度

● 关于算法的存储空间需求类似千算法的时间复杂度,采用渐近空间复杂度作为算法所需存储空间的量度,简称空间复杂度,S(n) = O(f(n))。
● 对于输入数据所占的具体存储量取决于问题本身,与算法无关,这样只需分析该算法在实现时所需要的辅助空间就可以了。若算法执行时所需要的辅助空间相对于输入数据量而言是个常数,则称这个算法为原地工作。
● 在具体代码中,如果在执行过程中,只声明一个变量,那么空间复杂度即为O(n),而如果执行过程中需要用到类似数组等需要占用多个存储空间的类型,空间复杂度则类似时间复杂度,为关于问题规模n的一个函数。

另外一点

通常情况下,鉴于运算空间较为充足,人们都以算法的时间复杂度作为算法优劣的衡量指标。故考题中一般以计算时间复杂度的题居多,但有事也会出现计算空间复杂度的题。

参考书籍

《数据结构C语言版》第2版 严蔚敏著

你可能感兴趣的:(计算机科学)