时间复杂度和空间复杂度
如何衡量一个算法的好坏?我们可以从时间和空间两个方面入手,也就是时间复杂度和空间复杂度。
无论是时间复杂度还是空间复杂度,都采用大O的渐进表示法。只保留最高阶项,且最高阶项的系数为1.例如一个算法的执行次数是2N^2+M+3,那么该算法的时间复杂度是O(N^2)。
时间复杂度
时间复杂度的衡量标准也就是算法的执行次数。我们下面用几段代码来练习一下算法时间复杂度的计算。
- 冒泡排序的时间复杂度
1 | void bubbleSort(int[] array) { |
假设有N个元素,最坏的情况下需要走N-1趟,每趟排序end-1次。例如有5个元素,N-5,那么需要走4趟,每趟排列次数分别为4,3,2,1。刚好构成等差数列,可以用等差数列求和公式计算执行次数,也就是[(N*(N-1))]/2
。
按照大O的渐进表示法,时间复杂度是O(N^2)。
- 二分查找的时间复杂度
1 | int binarySearch(int[] array, int value) { |
二份查找的好处是每次能去掉一半,第一次是去掉一半还剩一半,第二次去掉一半还剩1/4,第三次去掉一半还剩1/8……如下图所示:
所以二分查找的时间复杂度是O(logN)
- 递归求阶乘的时间复杂度
1 | long factorial(int N) { |
递归算法的时间复杂度 = 递归的次数 * 每次递归执行的次数
递归求阶乘算法递归次数为N,每次递归执行1次,所以时间复杂度是O(N)。
- 递归求斐波那契数列
1 | int fibonacci(int N) { |
递归次数,也就是层数为N的二叉树最多的结点个数,(2^N) - 1。
所以时间复杂度是O(2^N)。
空间复杂度
空间复杂度的衡量标准是临时占用的存储空间大小。随着计算机的发展,存储空间越来越大,空间复杂度也就不必太过关注。
- 递归求阶乘的空间复杂度
1 | long factorial(int N) { |
递归了N次,开辟了N个栈帧,每个栈帧占用常数的存储空间,所以该算法的空间复杂度是O(N)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 胖虎同学!
评论