乙個演算法執行所耗費的時間,從理論上來說是不能計算出來的,必須通過上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度或時間頻度,記為t(n)。
在剛才提到的問題當中,n稱為問題的規模,當
n不斷變化時,時間頻度
t(n)
也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。
一般情況下,演算法中基本操作重複執行的次數是問題規模
n的某個函式,用
t(n)
表示,若有某個輔助函式
f(n),
使得當n
趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作
t(n)=o(f(n)),
稱o(f(n))
為演算法的漸進時間複雜度,簡稱時間複雜度。
在各種不同演算法中,若演算法中語句執行次數為乙個常數,則時間複雜度為
o(1)。
另外,在時間頻度不相同時,時間複雜度有可能相同,如
t(n)=
與t(n)=4
按數量級遞增排列,常見的時間複雜度有:
常數階o(1) ,
對數階o(
次方階o(
o(隨著問題規模
n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。
與時間複雜度類似,空間複雜度是指演算法在計算機內執行時所需儲存空間的度量。記作: s(n)=o(f(n))
o(1)
temp=i;
i=j;
j=temp;
以上三條單個語句的頻度均為
1,該程式段的執行時間是乙個與問題規模
n無關的常數。演算法的時間複雜度為常數階,記作
t(n)=o(1)
。如果演算法的執行時
間不隨著問題規模
n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是乙個較大的常數。此類演算法的時間複雜度是
o(1)。
o(
語句1:交換i和
j的內容
sum=0; (一次)
for(i=1;i<=n;i++) (n+1次 )
for(j=1;j<=n;j++) (n^2次 )
sum++; (n^2次 )
t(n)=2
+n+1 =o(n^2)
語句2:
for (i=1;i語句
1的頻度是
n-1 語句2
的頻度是(n-1)*(2n+1)=2
-n-1
f(n)=2
-n-1+(n-1)=2
-2 該程式的時間複雜度t(n)=o(
).
o(n)
a=0;
b=1; ①
for (i=1;i<=n;i++) ②
語句
1的頻度:
2, 語句
2的頻度:
n, 語句
3的頻度:
n-1, 語句
4的頻度:
n-1, 語句
5的頻度:
n-1,
t(n)=2+n+3(n-1)=4n-1=o(n).
for (int i = 2; i < n; i++)
設迴圈體的
頻度是f(n),
則:2^f(n)<=n;f(n)<=
取最大值f(n)=
, t(n)=o(
)
演算法的時間複雜度與空間複雜度
雖然計算機能快速的完成運算處理,但實際上,它也需要根據輸入資料的大小和演算法效率來消耗一定的處理器資源。要想編寫出能高效執行的程式,我們就需要考慮到演算法的效率。演算法的效率主要由以下兩個複雜度來評估 時間複雜度 評估執行程式所需的時間。可以估算出程式對處理器的使用程度。空間複雜度 評估執行程式所需...
演算法的 時間複雜度 與 空間複雜度
如果乙個演算法的執行次數是 t n 那麼只保留最高次項,同時忽略最高項的係數後得到函式 f n 此時演算法的時間複雜度就是 o f n 為了方便描述,下文稱此為 大o推導法。由此可見,由執行次數 t n 得到時間複雜度並不困難,很多時候困難的是從演算法通過分析和數 算得到 t n 對此,提供下列四個...
演算法的時間複雜度與空間複雜度
常見的時間複雜度量級有 上面從上至下依次的時間複雜度越來越大,執行的效率越來越低。1.常數階o 1 int i 1 int j 2 i j int m i j 消耗的時候並不隨著某個變數的增長而增長 2.線性階o n for i 1 i n i 消耗的時間是隨著n的變化而變化的 3.對數階o log...