算法定义
*算法是解决某一特定问题的一组有穷指令的序列。
*算法是完成一个任务所需要的具体步骤和方法。也就是说给定初始状态或输入数据,经过有限次运算,能够得出所要求 或期望的终止状态或输出数据。
算法的五个重要特性
确定性、可行性、输入、输出、有限性
*确定性:算法的每种运算必须要有确切的定义,不能有二义性。
例:不符合确定性的运算
5/0
将6或7与x相加
未赋值变量参与运算
*可行性:算法中有待实现的运算都是基本的运算,原理上每种运算都能由人用纸和笔在有限的时间内完成。
例:整数的算术运算是“能行”的
实数的算术运算是“不能行”的
*输入:每个算法有0个或多个输入。这些输入是在算法开始之前给出的量,取自于特定的对象集合。
*输出:一个算法产生一个或多个输出,这些输出是同输入有某种特定关系的量。
*有限性:一个算法总是在执行了有穷步的运算之后终止。
计算过程:只满足确定性、能行性、输入、输出四个特性但不一定能终止的一组规则。
算法设计的例子—穷举法
穷举法:是从有限集合中,逐一列举集合
的所有元素,对每一个元素逐一判断和处
理,找出问题的解。
算法复杂性分析
算法复杂性:算法运行所需要的计算机资源的量
时间复杂性:需要时间资源的量
空间复杂性:需要空间资源的量
运行时间T(n)的估算
void childen_question(int n,int &k,int g[],int m[],
int s[])
{
int a,b,c;
k=0; //1
for(a=0; a<=n; a++) //1+2(n+1)
for(b=0; b<=n; b++) // n+1+2 (n+1)2
for(c=0; c<=n; c++) // (n+1)2 +2(n+1)3
if(!(c%3)&&a+b+c==n &&
//14(n+1)3 5*a+3*b+c/3==n)
{
g[k]=a; m[k]=b; s[k]=c;
k++; //4(n+1)3
}
}
T1(n) ≤1+ 1+2(n+1) + n+1+2 (n+1)2+
(n+1)2 +2(n+1)3+14(n+1)3+4(n+1)3
= 20n3 +64n2 +72n +31
时间复杂性的表示方法
常见的时间复杂度
O(1) :几乎不存在
O(logn):不能考虑全部输入
O(n):遍历、扫描全部输入
O(nlogn):许多分治算法
O(n2 ):两层循环
O(n3) :三层循环
O(2n ) :一个集合的所有子集
O(n!) :一个集合中的元素的所有组合
多项式时间算法
可用多项式来对运行时间限界的算法
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)
指数时间算法
运行时间用指数函数限界的算法
O(2n)<O(n!)<O(nn)
时间复杂度分析的步骤
1)确定用来表示问题规模的变量;
2)确定算法的基本操作;
3)写出基本操作执行次数的函数(运行时间函数);
4)如果函数依赖输入实例,则分情况考虑:最坏情况、最好情况、平均情况;
5)只考虑问题的规模充分大时函数的增长率,用渐近符号O 、Θ、Ω 、o来表示。
6)常用O和Θ
一般:
检索和排序问题,可选元素比较操作作为基本操作
矩阵乘法问题,可选数乘作为基本操作
遍历链表问题,可选设置或更新链表指针作为基本操作
图的遍历问题,可选访问图中的顶点的操作作为基本操作
例:分析以下程序段的时间复杂度
① for(k=1; k<n ; k++)
y = y+1; O(n)
② for(k=1; k<n ; k++)
{
y = y+1;
for(j=0; j<=(2*n); j++)
x++; O(n2)
}
③ for(k=0; k<n ; k++)
for( m=0; m<= k; m++)
A[k][m] = m+k; O(n2)
④ for(k=0; k<n; k++)
for( m=0; m<n; m++)
{
C[k][m] = 0;
for(j=0; j<n; j++)
C[k][m] += A[k][j]*B[j][m]; O(n3)
}
最好情况、最坏情况、平均情况分析
有些算法的运行时间除与问题规模有关外,还与输
入元素的初始排列顺序有关。因此,有3种分析方法:
最好情况:依据输入元素顺序,算法所达到的最短运
行时间。
最坏情况:依据输入元素顺序,算法所达到的最长运
行时间。
平均情况:算法的运行时间取算法所有可能输入的平
均运行时间。
练习
练习:分析下列算法的最好情况、最坏情况、
平均情况的时间复杂性.
输入:数组A[],元素个数n
输出:按递增顺序排列的数组A[]
void insert_sort(int A[], int n)
{
int a,i,j;
for(i=1; i<n; i++) {
a = A[i];
j = i-1;
while(j>=0 && A[j]>a) {/* 非递增*/
A[j+1] = A[j];
j--;
}
A[j+1] = a; }
}
分析:
最好情况:元素按升序排列,此时while不执行,故时间复杂性为o(n)
最坏情况:元素按降序排列,此时,while每次执行最大次数,故时间复杂性为o(n2)
算法的空间复杂性分析
算法的空间复杂性,指的是为解一个问题实例而需
要的存储空间。有两种分析方法:
1.算法所需的工作空间
不包含存储输入数据、程序代码和常数的空间,
仅包含算法函数体内新生成的变量空间。
2.程序所需的运行空间
包含存储输入数据、程序代码和常数的空间,以及含算法函数体内新生成的变量空间。