3.1 乘方實現
A:實現方法
乘方實現有兩種方法,一個是使用O(N)的時間複雜度還有種方法可以使用遞歸的方式,遞歸的公式如下
通過兩種方式的實現,可以進行比較兩種方法的時間複雜度
B:時間複雜度
第二種方法的遞歸表達式如下
通過主定理可以算出第二種的時間複雜度爲O(lgn)
C:兩種方法的時間比較
結果分析:
從上面可以看出當次方比較小的時候,第一種方法即時間複雜度爲O(N)的算法是比較優的,而當次方比較大的時候,O(lgn)的算法是比較優的。
代碼:
package com.sunliang.lecture_03;
public class powerANumber {
/**
* 算法導論第三課:關於一個數的次方:
*
*
*/
public static void main(String[] args) {
//計算兩種方法的時間的不同
int cycle = 1000000000;
long startTime = System.currentTimeMillis();
for(int i =1;i<cycle;i++) {
power(3,70);
}
long endTime = System.currentTimeMillis();
System.out.println("常規方法運行時間" + (endTime-startTime)+"毫秒");
startTime = System.currentTimeMillis();
for(int i=1;i<cycle;i++) {
power_solution2(3,70);
}
endTime = System.currentTimeMillis();
System.out.println("常規方法運行時間" + (endTime-startTime)+"毫秒");
}
/**
* 第一種思路:非常常規的解法
*
*
*/
public static int power(int x,int n) {
int result = 1;
for(int i =1;i<=n;i++) {
result = result*x;
}
return result;
}
/**
* 第二種方法:使用分治法
*
*/
public static int power_solution2(int x,int n) {
if(n==0) {
return 1;
}
if(n==1) {
return x;
}
int result = power_solution2(x, n>>1); //最好使用移位操作會比較快
result = result * result;
if((n & 1)==1) {//如果是奇數
result = result * x;
}
return result;
}
}
3.2 merge sort
歸併排序的遞歸公式爲
通過主定理可以得出算法複雜度爲O(nlgn)
3.3 binary search
二分查找的遞歸公式爲
通過主定理的case 2可以得出算法複雜度爲O(lgn)
3.4 fibonacci Number
下一個文檔繼續將fibonacci數