算法複雜度的評估以及經常使用函數的複雜度計算

1、評估算法複雜度

  

  舉例:

    算法複雜度爲O(n):

      

    算法複雜度爲O(n2):

      

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

      

    算法複雜度爲O(lgN):

       

    算法複雜度爲O(1):

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

2、常見函數的複雜度計算

  橫軸表明數據規模,縱軸表明所花時間,這個圖很重要,但願你們記住。

  

  

   直觀地看算法複雜度與處理規模與所花時間的關係  100000000次運算大概1秒

  

  因此在平常算法的設計中,須要儘可能把算法複雜度優化到接近成O(lgN)。

3、順序查找與二分查找的性能對比

  代碼: 

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)的性能差異很大,函數

4、基礎排序算法的性能對比

  二的冪表

  

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

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

4、遞歸算法的性能分析 

  一、子問題的規模降低        T(n/2) 表明每一層丟一半     T(n-1)表明降低一層
  二、子問題的答案的處理消耗的時間       每一層消耗的時間       O(1)表明每一層消耗常數時間        O(n)表明每一層消耗線性時間
  寫出相似下面的式子。
  T(n) = T(n-1) +O(1)  

  

相關文章
相關標籤/搜索