时间复杂度:
时间复杂度和程序执行的语句次数有关。程序执行的语句数越多,那么耗时越长,时间复杂度越高。
但是时间复杂度是一个对大规模数据的估计,所以只在乎最高次幂,不管系数和低次幂。
常见的时间复杂度如下表所示:
时间复杂度的推导:
能够节省时间的巧妙算法,其本质都是通过一个时间复杂度是O(1)的操作,将原来规模为N的问题变为规模为N/2的问题。所以能够推导出二分法的时间复杂度为:
T(n) = T(n/2) + O(1) = T(n/4) + O(1) = …..= T(1) + O(1) * logn
在分析算法时间复杂度的时候,先看这个算法的时间复杂度,然后去找采用这个算法之后,问题的规模有没有变化。
1.使用一个O(N)的算法,将N的规模缩小一半:这个算法的时间复杂度是O(N)。按照上述公式,最后推出的时间复杂度计算公式为:
T(1) + O(1) + O(2) +O(4) + O(8) +…o(N/2) +O(N) 这些的和是O(2*N),即为O(N)。这个和二分的区别是,利用时间复杂度为O(N)的操作将数组分开的,而不是O(1)。
2. 利用O(1)的时间将N的问题拆为两个O(N/2)的问题:
时间复杂度为O(N.2)。因为这里虽然拆成N/2的问题,但是是2个N/2。所以最后还是N个问题。
空间复杂度:
主要是建立的数组或者HashMap所消耗的空间。常见算法的空间复杂度:
快排:最优:O(logn) 最坏:O(n)
二分: O(1)
最短路径(Dijkstra):O(V) V表示点集大小。