标签:判断 分析 ati 部分 循环 static public int array
一般法则
法则1——for循环
一个for循环的运行时间至多是该for循环内部语句的运行时间乘以迭代次数
法则2——嵌套的for循环
从里向外分析循环,一组嵌套循环内部语句的运行时间为该语句的运行时间乘以该组所有的for循环的大小的乘积。
法则3——顺序语句
将各语句的运行时间求和
法则4——if/else语句
不超过判断的运行时间加上,两部分中运行时间长者
下方代码表面是递归实际上是一个简单的循环,从而其运行时间为O(N)
1 public static long factorial(int n) { 2 if (n <= 1) { 3 return 1; 4 } else { 5 return n * factorial(n - 1); 6 } 7 }
递归正常使用时,将其转换成一个循环结构是很困难的。
1 public long fib(int n) { 2 if (n <= 1) { 3 return 1; 4 } else { 5 return fib(n - 1) + fib(n - 2); 6 } 7 } 8 9 public long arr(int n) { 10 long[] array = new long[n + 1]; 11 if (n <= 1) { 12 return 1; 13 } else { 14 array[0] = 1; 15 array[1] = 1; 16 for (int i = 2; i <= n; i++) { 17 array[i] = array[i - 1] + array[i - 2]; 18 } 19 return array[n]; 20 } 21 }
以上例子中同样是计算斐波那契数列第n项
使用数学归纳法易证得 fib(n) = Ω((3/2)n) (n>4) ,fib(n) = O((5/3)n) , 而arr(n) = O(n),显然fib(n)需要花更多的时间
标签:判断 分析 ati 部分 循环 static public int array
原文地址:https://www.cnblogs.com/TedXiong/p/13337379.html