算法回馬槍 算法複雜度

算法的漸進時間複雜度   簡稱時間複雜度

 

在常數操作數量的表達式中,

只要高階項,不要低階項,也不要高階項的係數,剩下的部分

如果記爲f(N),那麼時間複雜度爲O(f(N))

 

簡單來說就是大O表示法不考慮乘以、除以、加上、減去的數字

如O(n+26)、O(n-26)、O(n*26)、O(n/26)都可以表示爲O(n)

 

O(an^2+bn+c)表示爲O(n^2)      不考慮常數項   不考慮低階項 

 

評價一個算法流程的好壞,先看時間複雜度的指標,然後再分

析不同數據樣本下的實際運行時間,也就是常數項時間(就是係數)。

 

大O表示法指出了算法有多快

大O表示法指出了最糟情況下的運行時間

 

算法的速度指的並非時間,而是操作數的增速

談論算法的速度時,我們說的是隨着出入的增加,其運行時間將以怎麼樣的速度增加

 

Demo1

如遍歷輸出一個數組 O(n)

如二分查找 O(log n)   log n默認是以2爲底的   (在有序數組中每次取原來的一半,8個數就需要二分3次)

Demo2

繪製上述16個小方格

法一: 一個個畫,畫16個  O(n)

法二:依次對摺,只用對摺4次就能形成16個小方格   O(logn)

 

Demo3

   

流程1: O(M*N)

流程2: O(M*logN)

流程3: 類似外排的方法

              1)排序 O(MlogM)

              2) O(N+M)

              總的複雜度: O(MlogM)+ O(N+M) 因爲N和M的大小不能確定,不能判斷MlogM和N的大小

 

流程2和3的選取根據樣本量的多少決定(根究N和M的大小)

 

附上流程3代碼:

public static void solution(int []A  ,int[]B){
        int N=A.length;
        int M=B.length;

        //先把M排序   快速排序的複雜度爲 O(MlogM)
        quicksort(B,0,M-1);

        int i=0;
        int j=0;
        while(i<N && j<M){
            if(B[j]<A[i]){
                System.out.println(B[j]);
                j++;
            }else if(B[j]==A[i]){
                //do nothing
                j++;
            }
            else if(B[j]>A[i]){
                //do nothing
                i++;
            }
        }
    }

    public static int partition(int []a,int low,int high){       //核心算法在分區,利用遞歸不斷縮小分區的區間,最終達到排序的目的
        int i=low;
        int j=high;
        int pivotkey=a[low];

        while(i<j){
            while(i<j&&a[j]>=pivotkey){
                j--;
            }
            a[i]=a[j];   //a[j]<pivotkey
            while(i<j&&a[i]<=pivotkey){
                i++;
            }
            a[j]=a[i];	//a[j]>pivotkey
        }
        a[i]=pivotkey;  //基準歸位
        return i;
    }
    public static void quicksort(int []a,int low,int high){

        if(low<high){
            int pivotkeyLocation=partition(a,low,high); //找到中軸
            quicksort(a,low,pivotkeyLocation-1);     //對中軸左邊的排序
            quicksort(a,pivotkeyLocation+1,high);    //對中軸右邊的排序
        }
        else {
            return;
        }
    }




    public static void main(String []args){
        int []A={2,4,7,8,9};   //有序數組
        int []B={1,9,7,8,4,5,6};
        solution(A,B);

    }

運行結果:

 

算法的存儲空間需求:

空間複雜度   算法所需存儲空間的度量  額外的的存儲空間

如創建一個臨時變量

如創建一個數組  ,或創建一個HashMap

都是算法消耗的額外存儲空間

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章