日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(渐进)复杂度分析(上)

發布時間:2023/12/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (渐进)复杂度分析(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

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的累加和?,F在我們來估算下這段代碼的執行時間。

從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。

總結

以上是生活随笔為你收集整理的(渐进)复杂度分析(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。