1. 程式人生 > >玩轉演算法面試-資料規模,時間複雜度,均攤複雜度(筆記)

玩轉演算法面試-資料規模,時間複雜度,均攤複雜度(筆記)

資料規模

這裡寫圖片描述

時間複雜度

並不是所有的雙層迴圈都是O(n^2)的

這裡寫圖片描述

複雜度實驗來確定複雜度

這裡寫圖片描述

 // O(N) 兩倍增加
    int findMax( int arr[], int n ){

        assert( n > 0 );

        int res = arr[0];
        for( int i = 1 ; i < n ; i ++ )
            if( arr[i] > res )
                res = arr[i];

        return res;
    }

這裡寫圖片描述

隨後,O(n^2),資料規模乘二,時間複雜度乘4……
隨著資料的增加,可以看到O(logN)

這裡寫圖片描述

遞迴演算法時間複雜度分析

不是有遞迴的函式就一定是O(nlogn)
深入:主定理

這裡寫圖片描述

均攤複雜度(Amortized Time)

均攤分析和平均情況時間複雜度,前者是一個序列的操作取平均值,後者是針對不同輸入來計算平均值
動態陣列(Vector)每一個操作增加一個元素,刪除一個元素相應的複雜度,就需要Amortized Time
動態棧,動態佇列類似(陣列)

這裡寫圖片描述

複雜度震盪

當我們進行resize操作時,也就是在有值的陣列還剩一半的時候,我們需要減去剩下的一半空陣列;但是當我們再要新增一個元素時,我們也要增加一半的陣列的容量,這步操作時間複雜度是O(n),如果我們者這個臨界點不停的新增元素,刪除元素的話,此時也就無法進行均攤,時間複雜度為0(n)
這裡寫圖片描述

所以,我們為了避免複雜度震盪,可以嘗試這種策略:當元素個數為陣列容量的四分之一時,resize,這樣可以為再新增的元素留出餘地,這時,平均來看,我們的時間複雜度還是O(1)的