数据结构3-4
上一篇 /
下一篇 2010-07-04 20:34:48
第三课
本课主题:算法及算法设计要求
教学目的:掌握算法的定义及特性,算法设计的要求
教学重点:算法的特性,算法设计要求
教学难点:算法设计的要求
授课内容:
一、算法的定义及特性
1、定义:
ispass(int
num[4][4])
{
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(num[i]
[j]!=i*4+j+1)/*一条指令,多个操作*/
return
0;
return
1;
}/*上面是一个类似华容道游戏中
判断游戏是否结束的算法*/
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中
每一条指令表示一个或多个操作;此外,一个算法还具有下列五个重要特性:
2、算
法的五个特性:
有穷性 | 一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,
且每一步都可在有穷时间内完成; |
确定性 | 算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。
有任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的输出。 |
可行性 | 一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基
本运算执行有限次来实现的。 |
输入 | 一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集
合。 |
输出 | 一个算法有一个或多个的输出。这些输出是同输入有着某些特定关系
的量。 |
例:
有穷性 | haha() {/*only a joke,do nothing.*/ } main() {printf("请稍等...您将知道世界的未日..."); while(1) haha(); } |
确定性 | float average(int
*a,int num) {int i;long sum=0; for(i=0;i<num;i++) sum+=*(a++); return sum/num; } main() {int score[10]={1,2,3,4,5,6,7,8,9,0}; printf("%f",average(score,10); } |
可行性 | |
输入 | |
输出 | getsum(int num) { int i,sum=0; for(i=1;i<=num;i++) sum+=i; } /*无输出的算法没有任何意义, |
二、算法设计的要求
1、正确性
算法正确性的四个层次 |
程序不含语法错误。 | max(int a,int
b,int c) { if (a>b) {if(a>c) returnc; else returna; } } |
程序对于几组输入数据能够得出满足规格说明要求的结果。 | max(int a,int
b,int c) { if (a>b) {if(a>c) return a; else return c; } } /*8,6,7*/ /*9,3,2*/ |
程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得
出满足规格说明要求的结果。 | max(int a,int
b,int c) { if (a>b) {if(a>c) return a; else return c; } else {if(b>c) return b; else return c; } } |
程序对于一切合法的输入数据都能产生满足规格说明要求的结果。 | |
2、可读性
3、健壮性
4、效率与低存储量需求
效率指的是算法执行时间。对于解决同一问题的多个算法,执行时间
短的算法效率高。
存储量需求指算法执行过程中所需要的最大存储空间。
两者都与问题的规模有
关。
| 算法一 | 算法二 |
在三个整数中求最大者 | max(int a,int
b,int c) {if (a>b) {if(a>c) return a; else return c; } else {if(b>c) return b; else return c; }/*无需额外存储空间,只需两次比较*/ | max(int a[3]) {int c,int i; c=a[0]; for(i=1;i<3;i++) if (a[i]>c) c=a[i]; return c; } /*需要两个额外的存储空间,两次比较,至少一次赋值*/
/*共需5个整型数空间*/ |
求100个整数中最大者 | 同上的算法难写,难读 | max(int a[100]) {int c,int i; c=a[0]; for(i=1;i<100;i++) if (a[i]>c) c=a[i]; return c; } /*共需102个整型数空间*/ |
三、总结
1、算
法的特性
2、算法设计要求:正确性、可读性、
健壮性、效率与低存储量需求。
回目录上一课下一课
第四课
本课主题:算法效率的度量和存储空间需求
教学目的:掌握算法的渐近时间复杂度和空间复杂度的意义与作用
教学重点:渐近时间复杂度的意义与作用及计算方法
教学难点:渐近时间复杂度的意义
授课内容:
一、算法效率的度量
算法执行的时间是算法优劣和问题规模的函数。评价一个算法的优
劣,可以在相同的规模下,考察算法执行时间的长短来进行判断。而一个程序的执行时间通常有两种方法:
1、事后统计的方法。
缺点:不利于较大范围内的算法比较。(异地,异时,异境)
2、事前分析估算的方法。
程序在计算机上运行所需时间的影响因素 |
算法本身选用的策略 | |
问题的规模 | 规模越大,消耗时间越多 |
书写程序的语言 | 语言越高级,消耗时间越多 |
编译产生的机器代码质量 | |
机器执行指令的速度 | |
综上所述,为便于比较算法本身的优劣,应排除其它影响算法效率的
因素。
从算法中选取一种对于所研究的问题来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量度。
(原操作在所有该问题的算法中都相同)
T(n)=O(f(n))
上示表示随问
题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。
求4*4矩阵元素
和,T(4)=O(f(4)) f=n*n; | sum(int
num[4][4]) { int i,j,r=0; for(i=0;i<4;i++) for(j=0;j<4;j++) r+=num[i][j]; /*原操作*/ return r; } |
最好情况: T(4)=O(0) 最坏情况: T(4)=O(n*n) | ispass(int
num[4][4]) { int i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) if(num[i][j]!=i*4+j+1) return 0; return 1; } |
原操作执行次数和包含它的语句的频
度相同。语句的频度指的是该语句重复执行的次数。
语句 | 频度 | 时间复杂度 |
{++x;s=0;} | 1 | O(1) |
for(i=1;i<=n;++i) {++x;s+=x;} | n | O(n) |
for(j=1;j<=n;++j) for(k=1;k<=n;++k) {++x;s+=x;} | n*n | O(n*n) |
| | O(log n) |
| |
|
基本操作的执行次数不确定时的时间复杂度 |
平均时间复杂度 | 依基本操作执行次数概率计算平均 |
最坏情况下时间复杂度 | 在最坏情况下基本操作执行次数 |
二、算法的存储空间需求
类似于算法的时间复杂度,空间复杂度可以作为算法所需存储空间的
量度。
记作:
S(n)=O(f(n))
若额外空间相对于
输入数据量来说是常数,则称此算法为原地工作。
如果所占空间量依赖于特定的输入,则除特别指明外,均按最坏情况
来分析。
三、总结
渐近时间复杂度
空间复杂度
回目录上一课下一课
收藏
举报
TAG: