时间复杂度可以称之为一个函数,即数学里面带有未知数的函数表达式,它是衡量一个算法执行速度的快慢。用O()表示,括号里面的即为频度,就是执行算法的次数,它与算法的执行时间成正比,简称为大O阶。
计算大O阶的方法可以大概总结为三类:
第一,用常数1代替所有的加法常数。比如一个算法本来的次数是10,9+5等等,统一写为O(1)。
第二,在算得最后的答案只保留最高阶。比如本来为2N^2+N^2+10,后来结果写为O(N^2),常数也直接省略不写,因为是成比例的,可以去掉。
第三,如果最高阶存在且不是1,则去除这个项目相乘的常数,即系数。
当然,O(1)并不是说此算法只执行了一次,是指常数次。不是所有的时间复杂度都是看代码写出来的,有些还要看它的运行过程。像二分法,它的时间复杂度就是O(log2^N),这为对数阶,这个答案光看代码是看不出来的,要把它的运行过程写出来,在进行观察。斐波那契递归数列的时间复杂度计算方法也是如此,即为O(N^2)。当计算字符串的时间复杂度时,由于输入不同,时间复杂度不同。并且,字符串的时间复杂度分为三种情况:最好(第一个首字母,这样第一次就能找到)情况,执行1次。平均(除开第一和最后一个)情况,执行N/2次(可以理解为最好和最坏的平均值)。以及最坏(最后一个字母)情况,执行N次。所以通常都是拿最坏情况代替最终时间复杂度,即为O(N)。
空间复杂度就是为了计算变量的个数,它也用O()表示。我们平常对时间复杂度需掌握甚多,但对空间复杂度则需了解即可。它的大O()阶计算方法与时间复杂度类似,斐波那契递归数列的空间复杂度为O(N)。空间可以重复利用,不累计,但是时间不可重复使用,要进行累计。