什么是算法?
算法 : 是对特定问题求解步骤的一种描述,是指令的有限序列
此外,构成算法的求解步骤必须满足以下条件: 1. 有穷性; 2. 确定性; 3. 可行性。
算法分析基本概念
算法复杂性(Algorithm Complexity ) 算法复杂性的高低体现在运行该算法所需计算机资源的多少. 计算机中最重要的两种资源是时间和空间资源。更确切地说,算法的复杂性是算法运行所需要的计算机资源的量,需要的时间资源的量称为时间复杂性;需要的空间资源的量称为空间复杂性,如下: 时间复杂性(Time Complexity) 空间复杂性(Space Complexity。
算法分析:指的是对算法所需的两种计算机资源—时间和空间进行估算,所需要得资源越多,该算法的复杂度就越高。
输入规模与基本语句
基本语句:执行次数与整个算法的执行次数成正比的操作指令。 对 算法运行时间贡献最大,是算法中最重要的操作。
输入规模:输入量的多少。运行算法需要的时间是T是输入 规模 n 的函数,记为 T=T(N)。
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;
问题规模:n 基本语句:x++
最好、最坏和平均情况
基本语句的执行次数是否只和问题规模有关?
有些算法的时间代价只依赖于问题的输入规模,而与输入的具体数据无关。如上例合并算法。但有些算法,即使输入规模相同,如果输入数据不同,其时间代价也不相同。
例 : 在一维整型数组A[n]中顺序查找与给定值 k 相等的元素。
int Find(int A[ ], int n, int k)
{
for (i = 0; i < n; i++)
if (A[i] == k) break;
return i;
}
如果算法的时间代价与输入数据有关,则需要分析最好情况、最坏情况、平均情况。
以上三种情况下的时间复杂性, 各从某一个角度来反映算法的效率,各有各的用处,也各有各的局限性。但实践表明可操作性最好的,且最有实际价值的,是最坏情况下的时间复杂性。 一般来说, 最好情况和最坏情况的时间复杂性是很难计量的。有时也按平均情况计量时间复杂性,但要对输入不同数据的概率做人为的假设(一般是假设等概率)之后才能进行, 所做的假设缺乏必要的根据。因此,在最好情况和平均情况下的时间复杂性分析还仅仅是停留在理论上。
非递归算法分析的一般步骤
1. 决定用哪个(或哪些)参数作为算法问题规模的度量 2. 找出算法中的基本语句 3. 检查基本语句的执行次数是否只依赖于问题规模 4. 建立基本语句执行次数的求和表达式 5. 用渐进符号表示这个求和表达式。
对递归算法时间复杂度的分析,关键是根据递归过程建立递推关系式,扩展递归是一种常用的求解递推关系式的基本技术。