演算法採用的策略,方案
編譯產生的**質量
問題的輸入規模
機器執行指令的速度
由此可見,拋開這些與計算機硬體、軟體有關的因素,乙個程式的執行時間依賴於演算法的好壞和問題的輸入規模
我們研究演算法的複雜度,側重的是研究演算法隨著輸入規模擴大增長量的乙個抽象,而不是精確的定位需要執行多少次
我們不關心語言、環境等,只關心它所實現的演算法。
我們在分析乙個演算法的執行時間時,重要的是把基本操作的數量和輸入模式關聯起來
當n=1是,a演算法不如b演算法,隨著n的增長,a演算法反超b演算法,總體來說a比b演算法更優秀
函式的漸近增長:給定兩個函式f(n)和g(n),如果存在乙個整數n,使得對於所有的n>n,f(n)總是比g(n)大,那麼我們說f(n)的增長漸近快於g(n)
定義:在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。演算法的時間複雜度,也就是演算法時間度量,記作t(n) = o(f(n))。它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸近時間複雜度,簡稱時間複雜度,其中f(n)是問題規模n的某個函式。(關鍵點:執行次數==時間)
如何分析乙個演算法的時間複雜度
常數階:
int sum=0,n=100時間複雜度不是o(8),而是o(1);printf(
"hello world!");
printf(
"hello world!");
printf(
"hello world!");
printf(
"hello world!");
printf(
"hello world!");
printf(
"hello world!");
printf(
"hello world!");
printf(
"hello world!");
sum = (1+n)*n/2;
線性階:一般含有非巢狀迴圈涉及線性階,線性階就是隨著問題規模n的擴大,對應的計算次數呈直線增長
int i,sum=0,n=100時間複雜度為o(n);for(i=1;i<=n;i++)
平方階:n次巢狀迴圈
int i,j,n=100時間複雜度為o(nn);for(i=1;i<=n;i++)
}
對數階:
int i=1,n=100每次i*2就距離n更近一步,所以由2;while(i
x = n得到x = log2n,所以這個迴圈的時間複雜度為o(logn)
函式呼叫的時間複雜度分析
1int
i,j;
2for(i=0;i)// function函式的時間複雜度是o(1),所以整體的時間複雜度就是迴圈的次數o(n)
1int
i,j;
2for(i=0;i)
11 }//function內部的迴圈次數隨著count的增加(接近n)而減少,所以根據遊戲攻略演算法的時間複雜度為o(n2)
思考:
n++;// 1答案:上述**的時間複雜度為o(n^2)function(n);// n2
for(i=0;i)// n2
for(i=0;i)// n2
}
常見的時間複雜度
耗費的時間從小到大:
o(1) < o(logn) < o(n) < o(nlogn) < o(n2) < o(n3) < o(2n) < o(n!) < o(nn)
最壞情況和平均情況
首先我們要明白,我們在寫**時,完全可以用空間來換取時間。
舉個例子:判斷某一年是否為閏年
我們可以實現要給演算法,每給乙個年份,都會通過演算法計算得到是否是閏年的結果。
另一種演算法就是,建立乙個陣列,將所有年份按下標的數字對應,如果是閏年,則此陣列元素對應的值為1,否則為0.
解析:對比兩個演算法,第一種演算法很明顯節約空間,但是每一次查詢都需要進行運算,而第二種演算法,雖然在記憶體中存了幾千個陣列,但是每次查詢只需要一次索引即可。
這就是典型的空間換時間。
演算法的空間複雜度通過計算演算法所需的儲存空間實現,演算法的空間複雜度的計算公式為:s(n)=o(f(n)),其中,n為問題的規模,f(n)為語句關於n所儲存空間的函式。
通常,我們都是用「時間複雜度」來指執行時間的需求,是用「空間複雜度」指空間需求
當直接要求我們求「複雜度」時,通常是指時間複雜度
顯然,對時間複雜度的追求更屬於演算法的潮流qaq
資料結構與演算法 二 時間複雜度和空間複雜度
演算法採用的策略 方案 編譯產生的 質量 問題的輸入規模 機器執行指令的速度 由此可見,拋開計算機硬體,乙個程式的執行時間依賴於演算法的好壞和輸入規模。int i,sum 0,n 100 for i 1 i n i printf d sum int i,sum 0,n 100 sum i n n 2...
資料結構和演算法(二) 時間複雜度和空間複雜度
演算法效率的度量方法 事後統計方法 這種方法主要是通過設計好的測試程式和資料,利用計算機計時器對不同酸防編制的程式執行時間進行比較,從而確定演算法效率的高低。這種方法有很大的缺陷,必須依據演算法事先編制好測試程式,通常需要花費大量時間和精力,如果完了發覺測試的是糟糕的演算法,就會功虧一簣。不同測試環...
資料結構與演算法2 時間複雜度和空間複雜度
演算法效率的度量方法 事後統計的方法 事前分析估算方法。演算法的時間複雜度 在進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度記作 t n o f n 它表示隨問題規模n的增大,演算法執行時間的增長率和f n ...