分析一個算法以前,須要創建一個實現技術的模型,包括描述所用資源及其代價的模型c++
RAM模型:單處理器,隨機存取RAM算法
灰色領域:真實計算機包含的其餘指令,不是常量時間的那種。沒有對存儲器層次進行建模。併發
運行時間取決於輸入的內容函數
運行時間取決於數據的規模spa
一般咱們關心運行時間的上限(最壞狀況)code
注:咱們分析時間時要使用機器獨立的時間單位,即不考慮機器不一樣帶來的影響。排序
for j: 2 to length[A]: do key = A[j] i = j-1 while i>0 and A[i]>key do A[i+1] = A[i] i = i-1 A[i+1] = key
$cost:c_1;times:n$ (包含跳出循環的那次)遞歸
注:for循環是剛剛進入循環時就要判斷一次條件,而後再執行j--
,再判斷條件,直到判斷條件不知足,不進入循環。假設循環$n$個元素,實際執行$n+1$ 次比較內存
$cost:c_2;times:n-1$資源
$cost:c_3;times:n-1$
$cost:c_4;times:\sum\limits_{j=2}^nt_j, t_j$ 爲一次for循環中while循環的判斷次數
$cost:c_5;times:\sum\limits_{j=2}^n(t_j-1),$
$cost:c_6;times:\sum\limits_{j=2}^n(t_j-1)$
$cost:c_7;times:n-1$
$t_j$ 取決於與序列排序狀況有關,若是已經排好序了,$A[j-1]$老是小於key了,因此每次for循環只算判斷了一次while,總共$n-1$次,若是是逆序,前一個總比後一個大,知足while條件,每次for循環中while判斷次數爲$t_j=j-1+1=j$ ,總共$\sum\limits_{j=2}^n{t_j}$ 次。
總的運行時間:
$T(n)=c_1n+c_2(n-1)+c_3(n-1)+c_4\sum\limits_{j=2}^n{t_j}+c_5\sum\limits_{j=2}^n(t_j-1)+c_6\sum\limits_{j=2}^n(t_j-1)+c_7(n-1)$
$\Theta(g(n))={f(n):存在正常數c_1,c_2,n_0,對全部的n\ge{n_0},有0\le{c_1g(n)\le{f(n)}\le{c_2g(n)}}}$
$\Theta(g(n))$ 是一個集合,記號$f(n)=\Theta(g(n))$ 是指$f(n)$ 是這個集合中的一個元素,不是指相等
具體來講:當$n$大於某個數時,一個與$n$有關的函數$f(n)$,無論$n$如何增加,其大小老是被限制到$c_1g(n)$和 $c_2g(n)$之間。
在時間複雜度分析中,$f(n)$即咱們所要求的$T(n)$,當咱們不須要精確地求出$T(n)$時,咱們只須要大體知道它隨$n$增加時,其值的上下界如何,即這個算法的運行時間確定不會超過某個時間,不會低於某個時間。
**好比:$T(n)=\Theta(n^2)$ 表示該算法的運行時間不會超過$c_1n^2$ ,不會低於$c_2n^2$ **
$O(g(n))={f(n):存在正常數c,n_0,對全部的n\ge{n_0},有0\le{f(n)}\le{cg(n)}}$
$\Omega(g(n))={f(n):存在正常數c,n_0,對全部的n\ge{n_0},有0\le{cg(n)}\le{f(n)}}$
一個漸進正函數中的低階項和最高階項的係數在決定漸進確界(上界、下界)時能夠被忽略
分治法在每一層遞歸上都有三個步驟:
分解:將原問題分解爲若干個規模較小,相互獨立,與原問題形式相同的子問題;
解決:若子問題規模較小而容易被解決則直接解,不然遞歸地解各個子問題;
**合併:**將各個子問題的解合併爲原問題的解。
另外,分解到什麼規模就夠了呢?即分解到子問題能夠找到一個方法,使得在線性時間/常量時間內就能夠解決。好比歸併排序問題,排序到何時最容易解決呢?固然是分解到序列內只有一個元素
分治法的遞歸式
使用分治法的歸併排序的遞歸式
$$ T(n)=\begin{cases} \Theta(1) & n=1 \ \underbrace{2T(n/2)}{對兩個子序列排序}+\underbrace{\Theta(n)}{合併解} & n>1 \ \end{cases} $$
$$ T(n)=\begin{cases} \Theta(1) & n=1 \ 2T(n/2)+\Theta(n) & n>1 \ \end{cases} $$
注意問題: