2.1 算法的时间复杂性分析
算法的时间复杂性分析是一种事前分析估算的方法,他是对算法消耗的资源的一种渐进性分析方法。
渐进性分析:只关注输入规模增大时算法运行时间的增长趋势。
2.2 输入规模与基本语句
输入规模:指输入量的多少。
基本语句:执行次数与整个算法执行次数成正比的语句,基本语句对算法运行时间的贡献最大,是算法中最重要的操作。例如下行代码:
int SeqSearch(int A[],int n,int k)
{
for(int i=0;i<n;i++)
if(A[i] == k) break; //基本语句是这个比较操作A[i] == k
if(i == n) return 0;
else return (i+1);
}
//输入规模是带炸找的记录个数n
//更多例子,查找课本P18页内容
2.3算法的渐进分析
定义:若存在两个正的常熟c和n。对于任意的n >= N,都有T(n) <= c*f(n);则称T(n) = O(f(n)) <或者称算法在 O(f(n))中> 。
渐进分析要分析最坏,最好,平均情况。
★非递归算法的时间复杂性分析:确定问题的输入规模,找出算法的基本语句,检查基本语句的执行次数是否只依赖输入规模,建立基本语句执行次数的求和表达式,用渐进符号表示这个求和表达式(用大O表示)。
★递归算法的时间复杂性分析:递归就是将地推关系中等式的右边的项根据递推式进行替换。举例:
{ 7 n = 1
T(n) = {
{ 2T(n/2) + 5n^2 n > 1
解:T(n) = 2T(n/2) + 5n^2 = 2(2T((n/2)/2 + 5(n/2)^2 +5n^2 = 2(2(2T(n/8) + 5(n/4)^2) + 5(n/2)^2) + 5n^2 .... = 2^k*T(1) + 2^(k-1)*5(n/(2^(k-1)) + ... + 2*5(n/2)^2 + 5n^2
最终表达为:T(n) = 7n + 5n^2(2-1/2^(k-1)) = 10n^2-3n <= 10n^2 = O(n^2)
2.4 算法的空间分析
指的是算法在执行过程中需要的的辅助空间的数量,算法临时开辟的存储空间。例如起泡算法初始序列与排序结果都在r[n]中,在排序算法运行过程中设置了三个简单的变量,因此算法的空间复杂度为O(1),但是对于P19 例2.3来说空间复杂度就是N+M。
2.5 最优化算法
问题的计算复杂性下界:指计算这个问题所需的最小工作量,任何求解该问题的算法的时间复杂度都不会低于这个下界。
判定树模型:满足两个条件的二叉树,一是每一个内部结点对应一个形如x<=y的比较,如果关系成立,则控制转移到该结点的左子树,否则,控制转移到该结点的右子树;二是每一个叶子结点表示问题的一个结果,在用判定书模型建立问题的时间下界时,通常忽略求解问题的所有算数运算,只考虑执行分支的转移次数。
例题
下列算法的基本语句,执行了多少次,算法的时间复杂性?
int Stery(int n)
{
int S = 0;
for (int i = 1; i <= n; i++)
S = S + i * i;
return S;
}
基本语句: s=s+i*i; 执行了n次; 算法的时间复杂性O(n)。
int Q(int n)
{
if (n == 1)
return 1;
else
return Q(n-1) + 2 * n - 1;
}
基本语句: Q(n-1)+2*n-1; 执行了n次; 算法的时间复杂性O(n)。
for (i = 1; i <= n; i++)
if (2*i <= n)
for (j = 2*i; j <= n; j++)
y = y + i * j;
基本语句: 2*i <=n和y=y+i*i; 都执行了n/2次; 算法的时间复杂性O(n)。
基本语句找执行次数与整个算法执行次数成正比的,算法复杂度:带N就是O(n),N^2就是O(n^2).找N的最高次。
使用扩展递归技术求解下列递推公式

int T(int n){
if(n==1)
return 4;
else if(n>1)
return 3*T(n-1);
}
简单来说就是两个if区分开n的定义域,然后分别返回对应的计算式。
Comments NOTHING