数据结构教程 第三课 算法及算法设计要求

本课主题: 算法及算法设计要求

教学目的: 掌握算法的定义及特性,算法设计的要求

教学重点: 算法的特性,算法设计要求

教学难点: 算法设计的要求

授课内容:

一、算法的定义及特性

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) return c;
else return a;
}
}

程序对于几组输入数据能够得出满足规格说明要求的结果。 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、算法设计要求:正确性、可读性、健壮性、效率与低存储量需求。

时间: 2024-08-03 09:19:14

数据结构教程 第三课 算法及算法设计要求的相关文章

数据结构教程 第四课 算法效率的度量和存储空间需求

本课主题: 算法效率的度量和存储空间需求 教学目的: 掌握算法的渐近时间复杂度和空间复杂度的意义与作用 教学重点: 渐近时间复杂度的意义与作用及计算方法 教学难点: 渐近时间复杂度的意义 授课内容: 一.算法效率的度量 算法执行的时间是算法优劣和问题规模的函数.评价一个算法的优劣,可以在相同的规模下,考察算法执行时间的长短来进行判断.而一个程序的执行时间通常有两种方法: 1.事后统计的方法. 缺点:不利于较大范围内的算法比较.(异地,异时,异境) 2.事前分析估算的方法. 程序在计算机上运行所需

数据结构教程 第三十七课 实验八 排序实验

教学目的: 掌握简单插入排序.快速排序.堆排序的算法并加以应用. 教学重点: 教学难点: 授课内容: 实现下述三种算法,并用以下无序序列加以验证: 49,38,65,97,76,13,27,49 一.简单插入排序 二.快速排序 三.堆排序 以上算法的C源程序. #define MAXSIZE 20 #define LT(a,b) ((a)<(b)) typedef int KeyType; typedef int InfoType; typedef struct{ KeyType key; In

数据结构教程 第十七课 实验三:栈的表示与实现及栈的应用

教学目的: 掌握栈的存储表示方式和栈基本操作的实现方法 教学重点: 栈的基本操作实现方法,栈的应用 教学难点: 栈的存储表示 实验内容: 一.栈的实现 实现栈的顺序存储. 栈实现示例 #include<stdio.h> #include<malloc.h> #include<conio.h> #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OK 1 #define EQUAL 1 #define OVERFL

C#教程第三课:选择控制语句

教程|控制|语句 本节课将介绍如何使用C#选择控制语句,第三课将达到如下几个目的:1.学会"if"语句的用法. 2.学会"switch"语句的用法. 3.学会在"switch"语句中如何使用"break"语句. 4.理解"goto"语句的正确用法. 在前面几节课中,你所看到的程序都是顺序执行的.你无法控制输入语句,你所能做的就是跟着程序执行直到终止.本节课中,将介绍基于条件进行判断,从而选择进入相应的逻辑分

数据结构教程 第三十三课 哈希表(二)

教学目的: 掌握哈希表处理冲突的方法及哈希表的查找算法 教学重点: 哈希表处理冲突的方法 教学难点: 开放定址法 授课内容: 一.复习上次课内容 什么是哈希表?如何构造哈希表? 提出问题:如何处理冲突? 二.处理冲突的方法     成绩一 成绩二... 3 ...     ... ...     24 刘丽 82 95 25 ...     26 陈伟     ... ...     33 吴军     ... ...     42 李秋梅     ... ...     46 刘宏英    

数据结构教程 第三十一课 动态查找表

教学目的: 掌握二叉排序树的实现方法 教学重点: 二叉排序树的实现 教学难点: 构造二叉排序树的方法 授课内容: 一.动态查找表的定义 动态查找表的特点是: 表结构本身是在查找过程中动态生成的,即对于给定值key,若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录.以政是动态查找表的定义: ADT DymanicSearchTable{ 数据对象D:D是具有相同特性的数据元素的集合.各个数据元素均含有类型相同,可唯一标识数据元素的关键字. 数据关系R:数据元素同属

数据结构教程 第三十四课 插入排序、快速排序

教学目的: 掌握排序的基本概念,插入排序.快速排序的算法 教学重点: 插入排序.快速排序的算法 教学难点: 快速排序算法 授课内容: 一.排序概述 排序:将一个数据元素的无序序列重新排列成一个按关键字有序的序列. 姓名 年龄 体重 1李由 57 62 2王天 54 76 3七大 24 75 4张强 24 72 5陈华 24 53 上表按年龄无序,如果按关键字年龄用某方法排序后得到下表: 姓名 年龄 体重 3七大 24 75 4张强 24 72 5陈华 24 53 2王天 54 76 1李由 57

数据结构教程 第三十六课 选择排序、归并排序

教学目的: 掌握选择排序,归并排序算法 教学重点: 选择排序之堆排序,归并排序算法 教学难点: 堆排序算法 授课内容: 一.选择排序 每一趟在n-i+1(i=1,2,...n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录. 二.简单选择排序 算法: Smp_Selecpass(ListType &r,int i) { k=i; for(j=i+1;j<n;i++) if (r[j].key<r[k].key) k=j; if (k!=i) { t=r[i];r[i]=r[k

数据结构教程 第三十五课 实验七 查找

教学目的: 练习顺序查找.折半查找及二叉排序树的实现 教学重点: 教学难点: 授课内容: 顺序查找 折半查找 顺序查找及折半查找示例 #include <stdio.h> typedef int KeyType; typedef struct{ KeyType key; int maths; int english; }ElemType; #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)< (b)) #define LQ(a,b) ((a)&