1. 程式人生 > >演算法複雜度的評估以及常用函式的複雜度計算

演算法複雜度的評估以及常用函式的複雜度計算

一、評估演算法複雜度

  

  舉例:

    演算法複雜度為O(n):

      

    演算法複雜度為O(n2):

      

    演算法複雜度為O(1+2+...+n) ---> O(n2):

      

    演算法複雜度為O(lgN):

       

    演算法複雜度為O(1):

      高斯解決1+2+3+....+100的辦法 (1+100)*50  常數階演算法

二、常見函式的複雜度計算

  橫軸代表資料規模,縱軸代表所花時間,這個圖很重要,希望大家記住。

  

  

   直觀地看演算法複雜度與處理規模與所花時間的關係

  

  所以在日常演算法的設計中,需要儘量把演算法複雜度優化到接近成O(lgN)。

三、順序查詢與二分查詢的效能對比

  程式碼: 

public class Contrast {

    public static void main(String[] args) {
        
        int []x = new int[10000*10000];
        for (int i = 0; i < x.length; i++) {
            x[i] = i+1;
        }
        
        
int target = 10000*10000; long now = System.currentTimeMillis(); // 統計當前時間的方法 int index = binarySearch(x, 0, x.length-1, target); System.out.println("二分查詢所需時間:"+(System.currentTimeMillis()-now)+"ms"); System.out.println(target+"所在位置為:"+index); now
= System.currentTimeMillis(); index = search(x, target); System.out.println("順序查詢所需時間:"+(System.currentTimeMillis()-now)+"ms"); } /** * 二分查詢 非遞迴 * @param arr * @param low * @param high * @param key * @return */ static int binarySearch(int arr[],int low,int high,int key){ while(low<=high){ int mid = low + ((high-low) >> 1); // (high+low) >>> 1 防止溢位,移位更加高效,同時,每次迴圈都需要更新 int midVal = arr[mid]; if (midVal<key) { low = mid +1; }else if (midVal>key) { high = mid - 1; }else { return mid; // key found } } return -(low + 1); // key not found } /** * 順序查詢 */ static int search(int arr[],int key){ for (int i = 0; i < arr.length; i++) { if (arr[i]==key) { return i; } } return -1; } }

  結果:

    

  結論:二分查詢時間為0ms,時間幾乎可以忽略不計,可以發現這兩種查詢演算法的時間相差很大,所以O(lgn)與O(n)的效能差別很大,

四、基礎排序演算法的效能對比

  二的冪表

  

  冒泡、插入、選擇排序  這些排序演算法的時間複雜度就是O(n2)

  Arrays.sort() 採用的快速排序,時間複雜度是O(nlgn)  所以有時採用這個方法排序還比上面的排序演算法好用。