時間複雜度計算
時間複雜度距離
空間複雜度分析
是指令的集合,是為解決特定問題而規定的一系列操作,演算法就是計算機解題的過程。
乙個演算法通常來說具有以下五個特性:
輸入:乙個演算法應以待解決的問題的資訊作為輸入。
輸出:輸入對應指令集處理後得到的資訊。
可行性:演算法是可行的,即演算法中的每一條指令都是可以實現的,均能再有限的時間內完成。
有窮性:演算法執行的指令個數是有限的,每個指令優勢再有限時間內完成的,因此整個演算法也是再有限時間內可以結束的。
確定性:演算法基於特定的合法輸入,其對應的輸出是唯一的,即當演算法從乙個特定的輸入開始,多次執行同一指令集結果總是相同的。
舉例:如何求1+2+3+…+100=?
演算法1:依次相加while do-while for
演算法2:高斯解法:首尾相加*50
演算法3:使用遞迴實現:sum(100)=sum(99)+100 sum(99)=sum(98)+99…sum(2)=sum(1)+2 sum(1)=1
評價演算法優劣的根據:複雜度(時間複雜度和空間複雜度)
演算法的複雜性體現再執行演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間資源,因此複雜度分為時間和空間複雜度。
時間複雜度是指執行演算法所需要的計算工作量;
空間複雜度是執行這個演算法所需要的記憶體空間。
乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試。
乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。
乙個演算法中的語句執行次數稱為語句頻度或時間頻度,表示為t(n),n表示問題的規模
但有時我們想知道它變化時成型什麼規律,想知道問題的規模,而不是具體的次數,此時一i納入時間複雜度,一般情況下,演算法中基本操作重複執行的次數時問題規模n的某個函式用t(n)表示。
時間複雜度就是時間頻度去掉低階項和首項常數。
比如某個演算法的時間頻度時t(n)=10000nn+10n+3
但是時間複雜度時t(n)=o(nn)
平均時間複雜度是指所有可能的輸入例項均以等概率出現的情況下,演算法的期望執行時間,鑑於平均複雜度
第一:難計算
第二:由很多演算法的平均情況和最差情況的複雜度時一樣的。
所以一般討論最壞時間複雜度
為了進一步說明演算法的時間複雜度我們定義o、ω、θ符號
o符號給出了演算法時間複雜度的上界(最壞情況 《=)
ω符號給出了時間複雜度的下屆(最好情況》=)
θ符號給出了演算法時間複雜度的精確階(最好和最壞時同一階 = )
找出演算法中的基本語句;
演算法中執行粗疏最多的那條語句就是基本語句,通常時內層迴圈的迴圈體
計算基本語句的執行次數的數量級;
只需計算基本語句執行次數的數量級,之久以為著要保證基本語句執行次數的函式中的最高次冪正確即可,
可以忽略所有低次冪和最好次冪的係數,這樣能夠簡化演算法分析,並且式注意力集中再最重要的一點上:增長率
用大o記號表示演算法的時間效能
將基本語句執行次數的數量級放入大o記號中
int count =
0;
t(n)= 1
t(n)= o(1)
int count =0;
。。。int count100 =
100;
t(n)= 1
t(n)= o(1)
int n=
8,count=0;
for(
int i=
1; i<
10n+
100;i++
)
t(n)= 10n+100
t(n)= o(n)
int n=
8,count=0;
for(
int i=
1; i
int n=
8,count=0;
for(
int i=
1;i<=n;i++
)}
int n=
8,count=0;
for(
int i=
1;i<=n;i*=2)
}
int n=
8,count=0;
for(
int i=
1;i<=n;i++
)}
1+2+3+4+。。。+n=(1+n)n/2 ==》t(n)= o(n2)
int
fun(
int n)}}
return
(s);
}
由於演算法中臨時變數的個數與問題規模n無關,所以空間複雜度均為s(n)=o(1)
void
fun(
int a,
int n,
int k)
}else
fun(a,n,k+1)
;}}
此演算法屬於遞迴演算法,每次呼叫本身都要分配空間,fun(a,n,0)的空間複雜度為o(n)
注意:
空間複雜度相比時間複雜度分析很少
對於遞迴演算法來說,**一般都比較簡短,演算法本身所占用的儲存空間較少,但執行時需要占用較多的臨時工作單元;若寫成非遞迴演算法,**一般可能比較長,演算法本身占用的儲存空間較多,但執行時將可能需要較少的儲存單元。
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...