演算法導論第三課(fibonacci,二分查詢,歸併排序)
阿新 • • 發佈:2018-12-14
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數