时间复杂度和空间复杂度
时间复杂度
算法的时间复杂度是一个函数,它定量地描述了一个算法的运行时间。时间复杂度常用一个大 O 符号(不是零)来表示,不包括这个函数的低阶项和首项系数。
时间复杂度是渐近的,考虑的是这个值趋于无穷时的情况。
一般我们在计算时间复杂度时,需要考虑算法是否会有多重嵌套循环(即代码中包含的循环内部还有一个循环操作),因为嵌套循环势必会使时间复杂度升阶。而对于一个列表进行循环有限次数的操作,则无须考虑,因为我们会忽略首项的系数。
我们在计算一个算法的时间复杂度时,首先需要找出算法的核心部分,然后根据代码确认时间复杂度。
一般的时间复杂度按照性能从差到好有这么几种:O(n3)、O(n2)、O(nlogn)、O(n)、O(logn)、O(1)。
当算法的时间复杂度达到 O(n2) 以上时,性能就会相当差,我们应该寻找更优的方案。当然,对于某些比较特殊的算法,可能最优的性能也不会很好。
另外,O(nlogn)、O(logn) 内部的内容在数学里是错误的,一般应该是 log2n 等,但是这里的系数并不在我们的考虑范围之内,所以我们一般在计算复杂度时直接将其表示为 O(nlogn) 和 O(logn)。
for循环:O(n)
嵌套for循环:O(n*嵌套的个数)
while循环条件每次执行结果越来越接近限定值:有可能是O(logn)
空间复杂度
现在计算机的空间已经越来越便宜了,成本很低,空间复杂度考虑较少。
空间复杂度的表示其实和时间复杂度是一样的,都用大 O 符号表示。空间复杂度是对一个算法在运行过程中所消耗的临时空间的一个度量。
空间复杂度的计算方式和时间复杂度一样
一般我们认为对于一个算法,本身的数据会消耗一定的空间,可能还需要一些其他空间,如果需要的其他空间是有限的,那么这个时间复杂度为 O(1)。相对地,也有 O(n)、O(nlogn)、O(n2)
一维数组: O(n)
二维数组: O(n2)