1、第1章绪论1.4算法n算法、算法的特性n算法好坏的评价标准n算法的性能度量方法主要内容 算法:对特定问题的求解过程的描述,是指令的有限序列,也就是为解决某一具体问题而采取的有限的操作步骤。 程序是算法的实现,计算机按照程序逐步执行算法,实现对问题的求解。 定义:一个有穷的指令集,这些指令为解决某一特定任务规定了一个运算序列。算法 有输入有0个或多个输入 有输出有一个或多个输出(处理结果) 确定性每步定义都是确切、无歧义的,对于每一种输入,算法的执行路径只能有一条,即对于一种输入只能得到一种输出 有穷性算法应在执行有穷步后结束,每一步骤都能在有限时间 有 性每一条运算应 能 执行,即算法 描述的
2、操作都 过 实现的 运算的有限 行实现算法的五个重要特性*算法的描述:本课程采用类C+语言进行描述*常用的设计方法:*穷举法*贪心法*分治法*回溯法*动态规划法*裁剪与分枝界限法算法的描述与设计方法 : 序问题 确问题: 序 解决 :逐个 算法:currency1“0fi“fl “fl ”到“fl 求出 的 程序:程序 算法设计过程自顶向下逐步求精void selectSort( int a , const int n ) /对n个整数a0,a1,an-1, 按非递减顺序排序for ( int i= 0; i n-1; i+ ) int k = i;/从ai检查到an-1, 找最小的整数, 在
3、akfor ( int j = i+1; j n; j+)if ( aj 0)y = 1;else if(x = 0)y = 0;else y = -1;return y;第一个层次程序不包含语法错误int sign(int x)int y;if(x 1)y = 1;else if(x = 0)y = 0;else y = -1;return y;第二个层次输入100 输出10 0输入100 输出1int sign(int x)int y;if(x = 1)y = 1;else if(x = 0)y = 0;else y = -1;return y;第三个层次输入100 输出11 1输入0 输
4、出0-1 -1输入-100 输出-1int sign(int x)int y;if(x 0)y = 1;else if(x = 0)y = 0;else y = -1;if(x =0 x1234)y= 0;return y;第四个层次所有可能的输入 解决同一个问题存在多种算法,如何评估各种算法的好坏?运行算法所需要的计算机资 和 评 一个算法的 的 要 据 多 计算机资 程序运行 所要 的 程序 的数据结 的 如何评 ?算法的 法、 法算法的 估计 的 法算法效率的度量算法的后期测试n实的 法:采实 程序的执行时间n的 法: 过 机过程 行n在算法 的某些 时间 currency1或 curr
5、ency1定算法 某一 能 的时间。n采 具 的时间 具 顺序搜索 (Sequenial Search)#include using namespace std;int seqsearch ( int *a, const int n ,const int x )int i = 0;while ( i n & ai != x )i+;if ( i = n ) return -1;return i;int main()int n10 = 5000,10000,15000,20000,25000,30000,35000,40000,50000,100000;int * data;for ( int
6、j = 0; j 10; j+ ) data = new intnj;for ( int i = 0; i nj; i+ ) datai = (rand()*1000)%1000;datanj - 1 = 1000;/实验中待查找的数据clock_t start, stop;start= clock();seqsearch(data,nj,1000);stop= clock();double runTime = stop - start;cout nj 个数中找最后一个数所需要时间为: runTime endl;delete data;return 0;程序测试结果输出时间效率XY点状图020
7、4060801001201401601802000 20000 40000 60000 80000 100000 120000顺序查找不同数据规模下查找时间图程序在计算机 运行 时间的算法 的 问题的规 规 , 时间 多 程序的 , 时间 多 的机 机 执行指令的速度为便于比较算法本身的优劣应排除其它影响算法效率的因素 希望软件执行时间可预测算法分析感兴趣的不是具体的资源占用量,而是与具体的平台无关、具体的输入实例无关,且随着规模增长的值是可预测的。算法的事前估计 希望了解软件执行时间的变化趋势与问题规模之间的关系,用一定的规模数据作为输入时程序所需的基本操作的次数来描述时间效率 忽略细节完成一个基本操作所需要的时间应该与具体的被操作数无关算法的复杂性分析