1.名词解析
1.1 时间复杂度
一个算法执行所耗费的时间(运行一个程序所花费的时间)
百度百科:
一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n^2+3n+4与T(n)=4n ^2+2n+1它们的频度不同,但时间复杂度相同,都为O(n ^2)。
计算步骤:
- 找出算法中的基本语句,算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。
- 计算基本语句的执行次数的数量级。只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。
- 用大Ο记号表示算法的时间性能。将基本语句执行次数的数量级放入大Ο记号中。
如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加 。
计算规则:
- 复杂度为常数,如2113,9999,等等都表示为O(1)
- 复杂度包含n时,省略系数与常数项,只取n的最高阶项。如:2n+45 为 O(n) ; 4n^ 3+6n^2+n 为O(n^3)
- 复杂度为对数时:如log5(n)、log2(n) 等等 都表示为 O(logn)
- 省略低阶,只取高阶 (即取最大的)。如:logn+nlogn 表示为O(nlogn)
1.2 空间复杂度
指算法在计算机内执行时所需存储空间的度量(运行程序所需要的内存)
百度百科:
一个算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。
渐近空间复杂度也常常简称为空间复杂度。空间复杂度(SpaceComplexity)是对一个算法在运行过程中临时占用存储空间大小的量度。
一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。
2. 常见的复杂度
2.1 O(1)
O(1),即是最低的时空复杂度。即,耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变
例:哈希算法,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)
2.2 O(n)
时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍
例:遍历算法,找数组里最大或最小的值,需要把数组的 n 元素遍历一次,操作 n 次
2.3 O(n^2)
时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍
例:冒泡排序,双重for循坏,对n个数排序,需要扫描n×n次
2.4 O(log n)
当数据增大n倍时,耗时增大log n倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍)
例:二分查找,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标
2.5 O(n log n)
O(n log n)同理,就是n乘以log n,当数据增大256倍时,耗时增大256*8=2048倍
例:归并排序