簡單來說,大o描述的是演算法的執行時間和輸入資料之間的關係n代表資料的個數,時間複雜度中描述的是n趨近於無窮的情況。
o(1) 表示消耗的時間與資料的規模是沒有關係的。
o(n) 說明這個演算法的執行時間與資料的個數(n)呈線性關係
實際執行時間 t = c1*n + c2,c1和c2是常數,在不同的演算法中是不確定的。
所以並不一定時間複雜度為 o(n)的演算法執行時間就比o(n^2)的演算法快:
可能 o(n):t = 2000n + 10000 o(n^2):t = 1n*n + 0
這時,當資料量小於2000時,明顯o(n^2)的演算法要快。
均攤複雜度:
在**執行的所有複雜度情況中絕大部分是低階別的複雜度,個別情況是高階別複雜度且發生具有時序關係時,可以將個別高階別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度。例如,陣列每次插入乙個數的時間複雜度是o(1),當陣列滿了之後進行自動擴容一倍的時間複雜度是o(n)。如果按最壞情況分析,每次插入都進行擴容,那麼插入操作的時間複雜度就是o(n)。
如果按均攤複雜度分析,比如一開始陣列容量為4,那麼進行4次插入操作消耗了 4 個時間。當插入第5個數時,陣列擴容消耗了 4+1 個時間。也就是說,5次插入操作消耗了 9 個時間,平均每次操作的時間為 2。當陣列容量為n時,n+1次插入操作觸發擴容,總共消耗 2n+1 個時間。
2n+1 / n+1 平均每次操作消耗兩個時間。
均攤計算後,時間複雜度為o(1),它的耗時與資料量沒有關係。
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析(上)時間複雜度 空間複雜度
為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...