1. 程式人生 > >演算法導論第三課(fibonacci,二分查詢,歸併排序)

演算法導論第三課(fibonacci,二分查詢,歸併排序)

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數