怎么算matlab算法复杂度,算法复杂度分析
1. 何為數(shù)據(jù)結(jié)構(gòu)?何為算法?
簡單來說,數(shù)據(jù)結(jié)構(gòu)就是數(shù)據(jù)的存儲方式,比如數(shù)組就是把數(shù)據(jù)存在一段連續(xù)的內(nèi)存上,而鏈表則是通過指針的關(guān)聯(lián)將數(shù)據(jù)存在任意可用的內(nèi)存上;棧是先進后出,隊列是先進先出。
而算法則是對這些數(shù)據(jù)的操作方法,比如數(shù)據(jù)的插入、查找、刪除、排序等。
二者相輔相成,互為一體,數(shù)據(jù)結(jié)構(gòu)為算法服務(wù),而算法要在指定數(shù)據(jù)結(jié)構(gòu)上進行操作。
2. 復(fù)雜度分析?
學習數(shù)據(jù)結(jié)構(gòu)和算法的目的是為了在實際應(yīng)用的時候更加優(yōu)化地利用內(nèi)存,提高程序運行效率,而復(fù)雜度分析則是給我們提供一個衡量代碼質(zhì)量好壞的標準。
如果我們在不運行程序的情況下就可以定性知道代碼的內(nèi)存占用和時間消耗,這將會給我們提供一個當前程序的總體評估和未來的改進方向。
直接運行程序就可以知道算法的執(zhí)行時間和占用內(nèi)存,但這個過程往往會受到運行環(huán)境和數(shù)據(jù)規(guī)模的影響,因此,我們需要一個不用進行具體測試就可以粗略估計算法執(zhí)行效率的方法,這就是復(fù)雜度分析。
3. 時間復(fù)雜度
3.1 大 O 復(fù)雜度表示法
int cal(int n)
{
int sum = 0;
int i = 1;
for (; i <= n; ++i)
{
sum = sum + i;
}
return sum;
}
我們假設(shè)每行代碼的運行時間為 t,則第一二行代碼需要時間為 2 * t,第三四行代碼需要時間為 2n * t,總時間為 (2n+2) * t,代碼運行總時間與 n 成正比。
用大 O 法可表示為 O(2n+2),這并不代表代碼的實際執(zhí)行時間,只是表征代碼執(zhí)行時間隨數(shù)據(jù)規(guī)模的變化趨勢。
當 n 足夠大時,低階、常量和系數(shù)就可以忽略不計,直接表示為 O(n)。
3.2 常用分析方法
循環(huán)最多代碼,重點關(guān)注
串行代碼,復(fù)雜度相加
嵌套代碼,復(fù)雜度相乘
3.3 幾種常見復(fù)雜度
多項式量級
常量階
對數(shù)階
線性階
線性對數(shù)階
乘方階
非多項式量級(Non-Deterministic Polynomial)
指數(shù)階
階乘階
非多項式量級的算法的執(zhí)行時間會隨著數(shù)據(jù)規(guī)模的擴大急劇增加,是非常低效的算法。
3.4 進階情況
最好情況時間復(fù)雜度(Best Case Time Complexity)
最壞情況時間復(fù)雜度(Worst Case Time Complexity)
平均情況時間復(fù)雜度(Average Case Time Complexity)
以查找為例,看如下代碼
// n 表示數(shù)組 array 的長度
int find(int[] array, int n, int x)
{
int i = 0;
int pos = -1;
for (; i < n; ++i)
{
if (array[i] == x)
{
pos = i;
break;
}
}
return pos;
}
最好情況時間復(fù)雜度就是在程序最理想的狀態(tài)下,數(shù)組第一個元素就是我們要查找的元素,只需要查找一次;而最壞情況時間復(fù)雜度就是在程序最糟糕的狀態(tài)下,數(shù)組最后一個元素才是我們要查找的元素,需要查找完整個數(shù)組;
事實上,我們要查找的元素可能存在數(shù)組中的任何一個位置,甚至可能不存在于數(shù)組中,因此,考慮所有情況出現(xiàn)的概率,求出各種情況下時間復(fù)雜度的平均值,也就是平均情況時間復(fù)雜度。
均攤情況時間復(fù)雜度(Amortized Case Time Complexity)
// array 表示一個長度為 n 的數(shù)組
// 代碼中的 array.length 就等于 n
int[] 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;
}
這段代碼的功能是向數(shù)組中插入一個元素,當數(shù)組未滿時,直接插入,時間復(fù)雜度為O(1);當數(shù)組滿時,先計算數(shù)組所有元素的和,再插入元素,時間復(fù)雜度為 O(n)。
并且,兩種復(fù)雜度不同的操作具有一定的規(guī)律,一系列O(1)的插入導(dǎo)致數(shù)組占滿,然后緊跟著一個O(n) 的插入,再繼續(xù)循環(huán)往復(fù)。
這時候,我么就可以把O(n) 復(fù)雜度的這個操作平均分攤到前面的O(1)復(fù)雜度操作上去,整體的時間復(fù)雜度也就變成了O(1),這就是均攤情況時間復(fù)雜度。
如果大部分情況時間復(fù)雜度都很低,只有少數(shù)情況時間復(fù)雜度較高,并且這些操作具有前后的時序關(guān)系,那么我們就可以應(yīng)用均攤情況時間復(fù)雜度來進行分析。通常來說,均攤情況時間復(fù)雜度就等于最好情況時間復(fù)雜度。
4. 時間復(fù)雜度的計算
同階函數(shù)集合
稱為與f(n)同階的函數(shù)集合。
低階函數(shù)集合
稱為比 f(n)低階的函數(shù)集合。
高階函數(shù)集合
稱為比f(n)高階的函數(shù)集合。
嚴格低階函數(shù)集合
稱為f(n)的嚴格低階函數(shù)集合。
嚴格高階函數(shù)集合
稱為比f(n)高階的函數(shù)集合。
迭代法求解遞歸方程
Master 定理求解遞歸方程
5. 空間復(fù)雜度
空間復(fù)雜度表征程序占用內(nèi)存隨著數(shù)據(jù)規(guī)模的變化趨勢,分析程序中數(shù)據(jù)的分配空間即可,一般常見的復(fù)雜度有O(1)、O(n)、O(n*n)。
總結(jié)
以上是生活随笔為你收集整理的怎么算matlab算法复杂度,算法复杂度分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php远程文件包含攻击,利用SMB共享来
- 下一篇: matlab人脸追踪,求大神帮助我这个菜