複雜度分析 如何分析 統計演算法的執行效率和資源消耗

2021-09-12 19:49:14 字數 1713 閱讀 7379

事後統計法:

測試結果非常依賴測試環境;

測試結果受資料規模的影響很大;

表示演算法的執行時間與資料規模之間的增長關係;

只關注迴圈執行次數最多的**;

加法法則:總時間複雜度等於量級最大的那段**的複雜度;

乘法法則:巢狀**的複雜度等於巢狀內外**複雜度的乘積;

幾種常見的時間複雜度:

o(1):一般情況下,只要演算法中不存在迴圈語句、遞迴語句,即使有成千上萬的**,其時間複雜度也是o(1);

o(logn)、o(nlogn):在採用大o標記複雜度的時候,可以忽略係數,即o(cf(n)) = o(f(n));

o(m+n)、o(m*n):在無法事先評估m和n誰的量極大時,原來的加法法則就不正確了,需要將加法法則改為:t1(m) + t2(n) = o(f(m) + f(n)),但是乘法法則繼續有效:t1(m) * t2(n) = o(f(m) * f(n));

表示演算法的儲存空間與資料規模之間的增長關係;

常見的空間複雜度:o(1)、o(n)、o(logn);

總結:越高階複雜度的演算法,執行效率越低。常見複雜度從低階到高階有:o(1)、o(logn)、o(n)、o(nlogn)、o(n²);

// n 表示陣列 array 的長度

int find(int array, int n, int x)

} return pos;

}

如上端**:最好情況時間複雜度為 o(1);

如上端**:最壞情況時間複雜度為 o(n);

如上端**:平均情況時間複雜度為:

這個值就是概率論中的加權平均值,也叫作期望值,所以平均時間複雜度的全稱應該叫「加權平均時間複雜度」或者「期望時間複雜度」

均攤時間複雜度就是一種特殊的平均時間複雜度

// array 表示乙個長度為 n 的陣列

// **中的 array.length 就等於 n

int array = new int[n];

int count = 0;

void insert(int val)

array[0] = sum;

count = 1;

}array[count] = val;

++count;

}

這段**實現了乙個往陣列中插入資料的的功能。當陣列滿了之後,也就是**中的 count == array.length 時,我們用 for 迴圈遍歷陣列求和,並清空陣列,將求和之後的 sum 值放到陣列的第乙個位置,然後再將新的資料插入。但如果陣列一開始就有空閒空間,則直接將資料插入陣列。

所以平均時間複雜度為:

3. 每一次o(n)的插入操作,都會跟著n-1次o(1)的插入操作,所以把耗時多的那次操作均攤到接下來的n-1次耗時操作上,均攤下來,這一組連續的操作的均攤時間複雜度就是o(1);

演算法複雜度分析

分析非遞迴演算法效率的通用方案 1.決定用哪個 哪些 引數作為輸入規模的度量 2.找出演算法的基本操作 作為一規律,它總是位於演算法的最內層迴圈中 3.檢查基本操作的執行次數是否只依賴輸入規模。如果它還依賴一些其他的特性,則最差效率 平均效率以及最優效率 如果必要 需要分別研究。4.建立乙個演算法基...

演算法複雜度分析

演算法分析的四個漸進表示法 一般,o裡的,取最小的 一般,裡的,取最大的 一般分析時間複雜度,且常考慮最壞複雜度,常用o分析 三法則 法則一 如果t1 n o f n t2 n0 o g n t1 n t2 n max o f n o g n t1 n t2 n o f n o g n 法則二 如果...

演算法複雜度分析

類別name 名字交換類排序 quicksort 快速排序 交換類排序 bubble sort 氣泡排序 選擇類排序 selection sort 選擇排序 選擇類排序 heapsort 堆排序插入類排序 insertion sort 插入排序 插入類排序 shell sort 希爾排序 bucke...