乙個演算法花費的時間與演算法中語句執行次數成正比,哪個演算法中語句執行次數多,它花費的時間就多。乙個演算法中語句的執行次數稱為語句頻度或時間頻度。記為t(n).
複製**
//比如計算1到100所有數字之和,我們設計倆種演算法:
int count = 0;
int end = 100;
//該演算法中使用了for迴圈,迴圈了100+1(最後一次判斷), 時間頻度為t(100)=100+1, 即t(n)=n+1
for(int i=1; i<=end; i++)
//而如果我們使用公式來計算,只需執行一次即可得到結果,時間頻度為t(100)=1, 即t(n)=1
count = (1+end)*end/2
複製**
時間複雜度
在電腦科學中,時間複雜性,又稱時間複雜度,演算法的時間複雜度是乙個函式,它定性描述該演算法的執行時間。這是乙個代表演算法輸入值的字串的長度的函式。時間複雜度常用大o符號表述,不包括這個函式的低階項和首項係數。使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的情況。
大o符號
大o符號(big o notation)是用於描述函式漸進行為的數學符號。更確切地說,它是用另乙個(通常更簡單的)函式來描述乙個函式數量級的漸近上界。在數學中,它一般用來刻畫被截斷的無窮級數尤其是漸近級數的剩餘項;在電腦科學中,它在分析演算法複雜性的方面非常有用。
常數項可忽略
如下圖, 2n+20和2n 、 3n+10和3n ,隨著n值的增大,執行曲線無限接近,這時我們基本可忽略掉常數項:20、10
低次項可忽略
如下圖,2n2+3n+10和2n2、n2+5n+20和n2,隨著n值的增大,執行曲線無限接近,這時我們基本可以忽略掉低次項和常數項:3n+10、5n+20
係數可忽略
如下圖, 3n2+2n和5n2+7n 隨著n值的增大,執行曲線無限接近,這時我們基本可以忽略掉低次項:2n、5n,和係數:3、5
但是要注意的是,如果n的指數大於2時,它們的係數會對結果影響較大,如下圖的 n3+5n和63+4n,這種情況則不可以忽略係數
所以我們可以把時間頻度t(n)=2n2+3n+10忽略掉常數、低次項和係數,記成時間複雜度o(n2)
常見的時間複雜度
常數階o(1)
複製**
//無論**執行了多少行,引數有多大,只要執行次數沒有隨著輸入引數的變化而變化,那它的時間複雜度就是 o(1)
int i = 1;
int j = 2;
++i;
j++;
int m = i+j;
複製**
對數階o(log2n)
複製**
//在while迴圈中,每迴圈一次i都會乘於2,當乘到x次時,i>n則退出迴圈,,所以while內的**會執行x次,即i^x>n,又因為i每次的乘數是2即底數為2,所以它的時間複雜度是 (log2n), 如果乘數是3則是o(log3n)
int i = 1;
while(i//在for迴圈中,j=i會被執行n次,所以它的時間複雜度為o(n)
int j = 0;
for(int i=1; i<=n; i++)
線性對數階o(nlog2n)
複製**
//線性對數對數階則是將對數階的**再迴圈執行n遍,如果i的乘數為2,則時間複雜度為o(nlog2n)
for(int m=1; m<=n; m++)
}複製**
立方階o(n^3)
k次方階o(n^k)
//立方階和k次方階參考平方階,原理是一樣的
指數階o(2^n)
//因為時間複雜度為0(2n)的演算法開銷過大,不推薦使用時間複雜度為0(2n)的演算法
亞馬遜測評 www.yisuping.com
資料結構與演算法 演算法與時間複雜度
演算法的五大特性 1.輸入,0 個或多個 2.輸入 1 個或多個 3.有窮性 4.確定性 5.可行性 如果乙個演算法執行效率 步驟 標記成 t n n 3 2 那麼這個2 可以看作乙個常數 k 就可以寫成 t n n 3 k 可以看出,如果改變常數k的值,並不會影響 t n 這個函式在座標軸的走勢,...
演算法與資料結構 時間複雜度
複雜度是衡量乙個演算法效率高低的乙個重要的因素,一般分為時間複雜度和空間複雜度。空間複雜度,一般在排序等 抽象資料型別的運算和物理實現 有關。本篇主要介紹時間複雜度的一些概念。我們在ram模型 1 記憶體無限大 2 基本運算o 1 下面考慮接下來的內容。準確的說,演算法的複雜性是執行演算法所需要的計...
資料結構與演算法 時間複雜度與空間複雜度
解決乙個問題的方法可能有很多,但能稱得上演算法的,首先它必須能徹底解決這個問題 稱為準確性 且根據其編寫出的程式在任何情況下都不能崩潰 稱為健壯性 程式和演算法是完全不同的概念。演算法是解決某個問題的想法 思路 而程式是在根據演算法編寫出來的真正可以執行的 例如,要依次輸出一維陣列中的資料元素的值,...