一、時間複雜度:實際是指程式執行次數,而不是程式執行時間
1.我們一般討論的是最壞時間複雜度,這樣做的原因是:最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的上限,以最壞代表最全。
2.時間複雜度的書寫規則:
①忽略常數項,用o(1)表示
②選取最壞時間複雜度即選取增長最快的項
③遞迴的時間複雜度=遞迴總次數 * 每次遞迴中基本操作所執行的次數
例1,**如下:
void test2(int n)
for (int iidx = 0; iidx < 2*n; ++iidx)
for (int i = 0; i < n; ++i)}}
f(n)=n^2+2n+10
則o(n)=n^2 //規則①②
例2,**如下:
int factorial(int n)//求n的階乘,遞迴法
}
因為if()判斷的兩種情況對應的兩個**塊中的基本操作的執行次數都為1
遞迴次數為n,所以o(n)=n*1=n //規則③
例3,**如下:
void test4(int m, int n)// f(n,m) = 2*m*n == o(m*n)}}
f(n)=2*m*n
則o(n)=(m*n) //規則①
3 . 常用的時間複雜度有以下七種,演算法時間複雜度依次增加:
o(1):常數型
o(log2 n):對數型
o(n):線性型
o(nlog2n):二維型
o(n^2):平方型
o(n^3):立方型
o(2^n):指數型
二、空間複雜度:不是計算實際占用的空間,而是計算整個演算法的輔助空間單元的個數,與問題的規模沒有關係(簡單理解就是演算法執行時建立的變數(包括臨時變數)個數)
1.空間複雜度書寫規則:
①忽略常數,用o(1)表示
②遞迴演算法的空間複雜度=遞迴深度n*每次遞迴所要的輔助空間
③對於單執行緒來說,遞迴有執行時堆疊,求的是遞迴最深的那一次壓棧所耗費的空間的個數,因為遞迴最深的那一次所耗費的空間足以容納它所有遞迴過程。遞迴是要返回上一層的,所以它所需要的空間不是一直累加起來的
(簡單說明單執行緒和多執行緒的區別:當你吃飯的時候**響了,你接完**再吃飯,這是單執行緒;你邊吃飯邊接**,這是多執行緒。)
例1,**如下:
int sum(int n)
return count;
}
空間複雜度:o(n)=1 //規則①
例2,**如下:
void fun(int n)
else
}
每次呼叫fun函式就會建立乙個10個元素的整型陣列,呼叫次數為n
空間複雜度:o(n*10)=o(n) //規則①②
三、例項解析:
1.二分查詢
1>遞迴法:
遞迴的次數和深度都是log2n,每次所需要的輔助空間都是常數級別的:
時間複雜度 : o(log2 n)
空間複雜度:o(log2 n)
2>迭代法:
int binary_sreach_iteration(int *arr, int sz, int num)
else if (arr[mid]迴圈的基本次數是log2 n,所以:時間複雜度是o(log2 n);
由於輔助空間是常數級別的所以:空間複雜度是o(1);
2.斐波那契
1>遞迴法:
時間複雜度o(2^n)
空間複雜度o(n)
2>迭代法:
int fib_iteration(int n)
while (n>2)
return c;
}
迴圈的基本次數是n-1,所用的輔助空間是常數級別的:
時間複雜度:o(n)
空間複雜度:o(1)
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...
時間複雜度 空間複雜度
演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...
時間複雜度 空間複雜度
時間複雜度 其實說白了講吧,演算法的時間複雜度就是演算法的執行次數。當討論乙個程式的執行時間時,注重的不應該是該時間的具體值,而是該時間的增長率,在乙個演算法中將該演算法的原操作重複執行的次數與問題規模n之間的關係記為函式f n f n f n 隨著問題規模的增大,它的增長率與f n f n f n...