分析一个算法以前,须要创建一个实现技术的模型,包括描述所用资源及其代价的模型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} $$
注意问题: