(渐进)复杂度分析(上)
?
https://blog.csdn.net/qiaobinXU/article/details/83115072
?
數據結構和算法本身解決的是“快”和“省”的問題,即如何讓代碼運行地更快,如何讓代碼更省存儲空間。所以,執行效率是算法一個非常重要的考量指標。
?
如何衡量你寫的代碼的執行效率?
時間、空間復雜度分析。
時間復雜度,全稱:漸進時間復雜度
空間復雜度,全稱:漸進空間復雜度
?
為什么需要復雜度分析?
我們可以通過設計、監控來得到算法執行的時間和占用的內存大小。但是這種統計方法有非常大的局限性。也稱作事后統計法。
局限1:測試結果非常依賴測試環境,比如,硬件的不同。
局限2:測試結果受數據規模的影響很大
? ? ? ? ? ? ?比如:對于一個排序算法,待排序數據的有序度不一樣,排序的執行時間就會有很大的差別。除此之外,如果測試數據規模太小,測試結果可能無法真實地反映算法的性能。比如,對于小規模的數據排序,插入排序可能反倒會比快速排序要快。
所以,我們需要一個不用具體的測試數據來測試,就可以粗略地估計算法的執行效率的方法。這就是復雜度分析。
?
大O復雜度表示法
T(n)代表執行的時間;n表示數據規模的大小;f(n)表示每行代碼執行的次數總和。
公式中的O,表示代碼的執行時間T(n)與f(n)表達式成正比。
大O的時間復雜度實際上并不具體表示代碼真正的執行時間,而是表示代碼執行時間隨數據規模增長的變化趨勢,所以也叫做漸進時間復雜度(asymptotic time complexity),簡稱時間復雜度。
例子:
int cal (int n) {int sum = 0;int i = 1;for (; i<=n; ++i) {sum = sum + i;}return sum; }這段很簡單的代碼,求1,2,3……n的累加和。現在我們來估算下這段代碼的執行時間。
從CPU的角度來看,這段代碼的沒一行都執行著類似的操作:讀數據-運算-寫數據。盡管每行代碼對應的CPU執行的個數、執行的時間都不一樣,但是,我們這里只是粗略估計,所以可以假設每行代碼執行的時間都一樣,為unit_time。
第2,3行代碼分別需要1個unit_time的執行時間,第4,5行都運行了n遍,所以需要2n*unit_time的執行時間,所以這段代碼總的執行時間就是(2n+2)*unit_time。大O表示為 T(n) = O(2n+2)。
當n很大時,你可以把它想象成10000、100000。而公式中的低階、常量、系數三部分并不左右增長趨勢,所以都可以忽略。我們只需要記錄一個最大量級就可以了。所以用大O表示法表示剛這段代碼的時間為T(n)=O(n)。
?
幾種常見時間復雜度實例分析(圖片來自極客時間)
對于上圖的這些復雜度量級,可以粗略地分為兩類,多項式量級和非多項式量級。
非多項式量級:指數階和階乘階
時間復雜度為非多項式量級的算法問題叫做NP(Non-Deterministic Polynomial,非確定多項式)問題。
當數據規模n越來越大時,非多項式量級算法的執行時間會急劇增加。所以,非多項式時間復雜度的算法其實是非常低效的算法。
?
O(1)只是常量級時間復雜度的一種表示方法。只要代碼執行時間不隨n的增大而增長,都記做O(1)
?
? ? ? ? ?
對數階時間復雜度。下面舉個例子
i = 1; while ( i <= n) {i = i * 2; }這段代碼的復雜度,只需要分析第三行代碼的循環次數,就能計算,因為第三行代碼是循環次數最多的。
從代碼中可以看出,變量i的值從1開始取,每循環一次就乘以2.當大于n時,循環結束。實際上,變量i的取值就是一個等比數列。
所以需要求解x的值,x = log 2 N (以2為底n的對數)。
由于對數是可以換底的。同時使用大O標記復雜度的時候,是可以忽略系數的,所以寫成?。 如果這段代碼循環了n遍,那就是。歸并排序、快速排序的時間復雜度都是。
?
? ? ? ?
表示代碼的復雜度由兩個數據的規模來決定。
?
越高階復雜度的算法,執行效率越低。
?
空間復雜度分析
同樣,全稱是漸進空間復雜度(asymptotic space complexity)。表示算法的存儲空間與數據規模之間的增長關系。
常見的空間復雜度:?,,
?
總結
時間復雜度分析
1、單段代碼看高頻。比如循環
2、多段代碼取最大。比如一段代碼中有單循環和多重循環,那么取多重循環的復雜度。
3、嵌套代碼求乘機。比如遞歸、多重循環
4、多個規模求加法。比如方法中有兩個參數控制兩個循環次數。那么就取二者復雜度相加。 O(m+n)
?
習題練習與問答環節
1、一個二進制數,輸入規模(空間復雜度)是bit。為什么
比如 8 用二進制表示就是 3個bit (2的3次方等于8),16用二進制表示是4個bit。以此類推,n用二進制表示就是個bit。
總結
以上是生活随笔為你收集整理的(渐进)复杂度分析(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PDF编辑器是怎么使用的
- 下一篇: 微信支付V3版开发中遇到的一个问题及原因