作为一个程序员为什么要了解时间复杂度与空间复杂度?
答: 为了分析算法效率,在同一问题存在多个算法时,进行时间和空间性能的比较,找出较优算法。
时间复杂度
算法效率=语句执行次数*每条语句执行的时间。我们更应该关注哪个方面呢?当然是语句执行次数了,可能有人会问到,时间不是更重要吗?因为在不同机器上,硬件性能参差不齐,例如在i9上执行只要1s,但拿i5去执行也许需要2s,当然这里只是打个比方。作为程序员我们可以控制语句执行次数,让程序更快。
为了客观反映一个算法的执行时间,可以用算法中的“基本语句”的执行次数来度量算法的工作量。基本语句也就是对算法运行时间贡献最大的语句(执行的最多的那句)。
算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作:T(n)=O(f(n))。它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。
也许单纯看这概念还是感到模棱两可,接下来不妨看看下面的例子。
eg1:{t+=t;x=0;}两条语句频度均为1,算法的执行时间是一个与问题规模无关的常数,所以算法的时间复杂度为T(n)=O(1),称为常数阶。即使这个常数再大,算法的时间复杂度都是O(1)。
eg2:
for(i=1;i<=n;i++) x=x+1;那么其中基本语句执行了n次,所以T(n)=O(n),称为线性阶。
eg3:
for(i=1;i<=n;i++) for(j=1;j<=n;j++) y++;
其中基本语句y++执行了n*n次,所以T(n)=O(n方)。称作平方阶。
当然还有的举不完,通常就是去找它基本语句执行的次数。也可以都求一遍,看哪个的增长得快,注意!!!在计算算法时间复杂度时,可以忽略所有低次幂项和最高次幂的系数(毕竟这是估算,但不能否定其意义),所以我们通常考虑它基本语句就行了。
空间复杂度
在了解了时间复杂度,空间复杂度中重复的概念便不再赘述。
空间复杂度:关于算法的存储空间需求,类似于算法的时间复杂度,我们采用渐进空间复杂度作为算法所需存储空间的度量,它也是问题规模n的函数,记作:S(n)=O(f(n))。
一个程序在机器上执行时,除了需要寄存本身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的辅助存储空间(比如交换2个数组中的元素,只用原本的这2个数组就可以完成,但你也可以新建一个数组来完成,那么这个新数组就叫辅助空间,通俗讲就是本来可以不用的,但是你用了它,辅助你完成了)。求空间O(n)你就去找辅助空间。若算法执行时所需要的辅助空间相对于输入数据量而言是个常数(中间设了个变量t),则称这个算法在原地工作,记住O(1)。若辅助空间是一维数组,则O(n).若为二维数组,则O(n方)。
当然了,这两个概念没有绝对一说,有时空间换时间,有时时间换空间,看程序所需。
注:本文章知识来源《数据结构》(C语言版 第二版)人民邮电出版社。仅用于学习交流,梳理知识内容而编,若知识有误可私信一起交流,里面有本人的见解与总结,仅供参考,谢谢大家的阅览。