算法时间复杂度分析
在看一个算法是否优秀时,我们一般都要考虑一个算法的时间复杂度和空间复杂度。现在随着空间越来越大,时间复杂度成了一个算法的重要指标,那么如何估计一个算法的时间复杂度呢?
时间复杂度直观体现
首先看一个时间复杂度不同的两个算法,解决同一个问题,会有多大的区别。
下面两个算法都是用来计算斐波那契数列的,两个算法会有多大的差异。
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
- 第一种:使用递归方式
/** * 使用递归方式计算斐波拉契数列 * @param index 计算的项数 */ public static long fibonacciUseRecursion(int index){ if(index <= 1){ return index; } return fibonacciUseRecursion(index-1) + fibonacciUseRecursion(index-2); }
- 第二种:使用非递归方式
/** * 不使用递归方式计算斐波拉契数列 * @param index 计算的项数 */ public static long fibonacciNoUseRecursion(int index){ if (index <= 1){ return index; } long first = 0; long second = 1; for (int i = 0; i < index - 1;i++){ second = first + second; first = second - first; } return second; }
对上面两种算法进行简单的运行时间统计,我们使用下面的代码进行简单的测试
public static void main(String[] args) { // 获取当前时间 long begin = System.currentTimeMillis(); // 计算第50项斐波拉契数列的值 System.out.println(fibonacciUseRecursion(50)); // 计算时间差,算法执行所花的时间 System.out.println("time:" + (System.currentTimeMillis() - begin) / 1000 +"s"); begin = System.currentTimeMillis(); System.out.println(fibonacciNoUseRecursion(50)); System.out.println("time:" + (System.currentTimeMillis() - begin) / 1000 + "s"); }
测试结果如下: