為了肉眼、實時、快速地來分析出**的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。
時間複雜度+空間複雜度
表示演算法的執行時間與資料規模之間的增長關係。
每行**對應的 cpu 執行的個數、執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行**執行的時間都一樣,為 unit_time。以上**則為(2n+2)*unit_time 所以,整段**總的執行時間 t(n) = (2n+2)*unit_time。所有**的執行時間 t(n) 與每行**的執行次數 n 成正比。則有
只關注迴圈執行次數最多的一段**o(2n+2)則直接表示為o(n)
加法法則:總的時間複雜度就等於量級最大的那段**的時間複雜度。那我們將這個規律抽象成公式就是:如果 t1(n)=o(f(n)),t2(n)=o(g(n));那麼 t(n)=t1(n)+t2(n)=max(o(f(n)), o(g(n))) =o(max(f(n), g(n))).
乘法法則:巢狀**的複雜度等於巢狀內外**複雜度的乘積
t1(n) = o(n),t2(n) = o(n2),則 t1(n) * t2(n) = o(n3)。落實到具體的**上,我們可以把乘法法則看成是巢狀迴圈
實際上,不管是以 2 為底、以 3 為底,還是以 10 為底,我們可以把所有對數階的時間複雜度都記為 o(logn)。為什麼呢?我們知道,對數之間是可以互相轉換的,log3n 就等於 log32 * log2n,所以 o(log3n) = o(c * log2n),其中 c=log32 是乙個常量。基於我們前面的乙個理論:在採用大 o 標記複雜度的時候,可以忽略係數,即 o(cf(n)) = o(f(n))。所以,o(log2n) 就等於 o(log3n)。因此,在對數階時間複雜度的表示方法裡,我們忽略對數的「底」,統一表示為 o(logn) 。我們迴圈執行 n 遍,時間複雜度就是 o(nlogn) 了。而且,o(nlogn) 也是一種非常常見的演算法時間複雜度。
從**中可以看出,m 和 n 是表示兩個資料規模。我們無法事先評估 m 和 n 誰的量級大,所以我們在表示複雜度的時候,就不能簡單地利用加法法則,省略掉其中乙個。所以,上面**的時間複雜度就是 o(m+n)。
針對這種情況,原來的加法法則就不正確了,我們需要將加法規則改為:t1(m) + t2(n) = o(f(m) + g(n))。但是乘法法則繼續有效:t1(m)*t2(n) = o(f(m) * f(n))。
表示演算法的儲存空間與資料規模之間的增長關係。
複雜度也叫漸進複雜度,包括時間複雜度和空間複雜度,用來分析演算法執行效率與資料規模之間的增長關係,可以粗略地表示,越高階複雜度的演算法,執行效率越低。常見的複雜度並不多,從低階到高階有:o(1)、o(logn)、o(n)、o(nlogn)、o(n2 )。等你學完整個專欄之後,你就會發現幾乎所有的資料結構和演算法的複雜度都跑不出這幾個。
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...