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