【数据结构与算法】复杂度分析
一、什么是復雜度分析?
1.數(shù)據(jù)結構和算法解決是“如何讓計算機更快時間、更省空間的解決問題”。
2.因此需從執(zhí)行時間和占用空間兩個維度來評估數(shù)據(jù)結構和算法的性能。
3.分別用時間復雜度和空間復雜度兩個概念來描述性能問題,二者統(tǒng)稱為復雜度。
4.復雜度描述的是算法執(zhí)行時間(或占用空間)與數(shù)據(jù)規(guī)模的增長關系。
二、為什么要進行復雜度分析?
1.和性能測試相比,復雜度分析有不依賴執(zhí)行環(huán)境、成本低、效率高、易操作、指導性強的特點。
2.掌握復雜度分析,將能編寫出性能更優(yōu)的代碼,有利于降低系統(tǒng)開發(fā)和維護成本。
三、如何進行復雜度分析?
1.大O表示法
1)來源
算法的執(zhí)行時間與每行代碼的執(zhí)行次數(shù)成正比,用T(n) = O(f(n))表示,其中T(n)表示算法執(zhí)行總時間,f(n)表示每行代碼執(zhí)行總次數(shù),而n往往表示數(shù)據(jù)的規(guī)模。
2)特點
以時間復雜度為例,由于時間復雜度描述的是算法執(zhí)行時間與數(shù)據(jù)規(guī)模的增長變化趨勢,所以常量階、低階以及系數(shù)實際上對這種增長趨勢不產決定性影響,所以在做時間復雜度分析時忽略這些項。
2.復雜度分析法則
1)單段代碼看高頻:比如循環(huán)。
2)多段代碼取最大:比如一段代碼中有單循環(huán)和多重循環(huán),那么取多重循環(huán)的復雜度。
3)嵌套代碼求乘積:比如遞歸、多重循環(huán)等
4)多個規(guī)模求加法:比如方法有兩個參數(shù)控制兩個循環(huán)的次數(shù),那么這時就取二者復雜度相加。
四、常用的復雜度級別?
多項式階:隨著數(shù)據(jù)規(guī)模的增長,算法的執(zhí)行時間和空間占用,按照多項式的比例增長。包括,
O(1)(常數(shù)階)、O(logn)(對數(shù)階)、O(n)(線性階)、O(nlogn)(線性對數(shù)階)、O(n2)(平方階)、O(n3)(立方階)
非多項式階:隨著數(shù)據(jù)規(guī)模的增長,算法的執(zhí)行時間和空間占用暴增,這類算法性能極差。包括,
O(2^n)(指數(shù)階)、O(n!)(階乘階)
五、如何掌握好復雜度分析方法?
復雜度分析關鍵在于多練,所謂孰能生巧。
六 、時間復雜度分析
時間復雜度的全稱是漸進時間復雜度,表示算法的執(zhí)行時間與數(shù)據(jù)規(guī)模之間的增長關系。
口訣
非多項式量級的算法問題叫作 NP(Non-Deterministic Polynomial,非確定多項式)問題
常見的多項式時間復雜度舉例
1. O(1)
一般情況下,只要算法中不存在循環(huán)語句、遞歸語句,即使有成千上萬行的代碼,其時間復雜度也是Ο(1)。
int i = 8;int j = 6;int sum = i + j;2. O(logn)、O(nlogn)
//O(logn)i=1;while (i <= n) {i = i * 2;}歸并排序、快速排序的時間復雜度都是 O(nlogn)
3. O(m+n)、O(m*n)
代碼的復雜度由兩個數(shù)據(jù)的規(guī)模來決定
//O(m+n) int cal(int m, int n) {int sum_1 = 0;int i = 1;for (; i < m; ++i) {sum_1 = sum_1 + i;}int sum_2 = 0;int j = 1;for (; j < n; ++j) {sum_2 = sum_2 + j;}return sum_1 + sum_2; }七、 空間復雜度
空間復雜度的時候,是指除了原本的數(shù)據(jù)存儲空間外,算法運行還需要額外的存儲空間
空間復雜度全稱就是漸進空間復雜度(asymptotic space complexity),表示算法的存儲空間與數(shù)據(jù)規(guī)模之間的增長關系。
八、 最好、最壞、平均、均攤情況時間復雜度
1.同一段代碼在不同情況下時間復雜度會出現(xiàn)量級差異,為了更全面,更準確的描述代碼的時間復雜度,所以引入這4個概念。
2.代碼復雜度在不同情況下出現(xiàn)量級差別時才需要區(qū)別這四種復雜度。大多數(shù)情況下,是不需要區(qū)別分析它們的。
最好情況時間復雜度(best case time complexity):最好情況時間復雜度就是,在最理想的情況下,執(zhí)行這段代碼的時間復雜度
最壞情況時間復雜度(worst case time complexity):最壞情況時間復雜度就是,在最糟糕的情況下,執(zhí)行這段代碼的時間復雜度。
平均情況時間復雜度(average case time complexity):平均時間復雜度的全稱應該叫加權平均時間復雜度或者期望時間復雜度
均攤時間復雜度(amortized time complexity):攤還分析法,一種特殊的平均復雜度
在代碼執(zhí)行的所有復雜度情況中絕大部分是低級別的復雜度,個別情況是高級別復雜度且發(fā)生具有時序關系時,可以將個別高級別復雜度均攤到低級別復雜度上。基本上均攤結果就等于低級別復雜度。
//最好O(1) 最壞O(N) 平均 O(1) 均攤// array表示一個長度為n的數(shù)組// 代碼中的array.length就等于nint[] array = new int[n];int count = 0;void insert(int val) {if (count == array.length) {int sum = 0;for (int i = 0; i < array.length; ++i) {sum = sum + array[i];}array[0] = sum;count = 1;}array[count] = val;++count;}這段代碼實現(xiàn)了一個往數(shù)組中插入數(shù)據(jù)的功能。當數(shù)組滿了之后,也就是代碼中的 count == array.length 時,我們用 for 循環(huán)遍歷數(shù)組求和,并清空數(shù)組,將求和之后的 sum 值放到數(shù)組的第一個位置,然后再將新的數(shù)據(jù)插入。但如果數(shù)組一開始就有空閑空間,則直接將數(shù)據(jù)插入數(shù)組。
平均復雜度計算
九、 如何分析平均、均攤時間復雜度?
1.平均時間復雜度
代碼在不同情況下復雜度出現(xiàn)量級差別,則用代碼所有可能情況下執(zhí)行次數(shù)的加權平均值表示。
2.均攤時間復雜度
兩個條件滿足時使用:1)代碼在絕大多數(shù)情況下是低級別復雜度,只有極少數(shù)情況是高級別復雜度;2)低級別和高級別復雜度出現(xiàn)具有時序規(guī)律。均攤結果一般都等于低級別復雜度。
總結
以上是生活随笔為你收集整理的【数据结构与算法】复杂度分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx的keeplive
- 下一篇: 强制html元素不随窗口缩小而换行