玩轉演算法面試-資料規模,時間複雜度,均攤複雜度(筆記)
阿新 • • 發佈:2019-01-26
資料規模
時間複雜度
並不是所有的雙層迴圈都是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)的