如何去评判一个算法的好坏呢?
我们可以从两个维度分别是时间和空间去评判,所以我们也可以根据这两点去优化我们的代码,从而使自己的算法的复杂度降低,效率提高。
那这样说的话,是不是我拿着不同的算法在不同的电脑上跑然后比较时间,谁的时间短,谁的算法更牛逼。那如果两台电脑的性能本就有着很大的差距呢?这样就不公平了,导致了比较的偏差。
大O表示法
那么我们可以使用一种表示法也就是大O表示法来具体表示时间复杂度和空间复杂度。它将代码的所有步骤转换为关于数据规模n的公式项,然后排除不会对问题的整体复杂度产生较大影响的低阶、系数项和常数项。
时间复杂度
其实该值表示的是,当数据的量级增加的时候,时间增长的一个趋势。
公式:T(n) = O(f(n))
O(1)的例子:
1 | int x = 0; |
O(n)的例子:
1 | for (int i = 1; i < n; i++){ |
再来看一个O(n^2)的案例:
1 | for (int i = 0; i < n; i++) { |
O(logn)的例子:
1 | int i=1; |
O(nlogn)的例子:
1 | for (int i = 1; i < n; i++){ |
空间复杂度
该复杂度表示的是内存空间随着数据的增加增长的趋势。
常用的空间复杂度O(1),O(n),O(n^2)
O(1)的例子:
1 | int x = 0; |
O(n)的例子:
1 | int[] arr = new int[n]; |
O(n^2)的例子:
1 | int[][] arr = new int[n][n]; |