_数据结构_课程教学中的案例设计及应用_袁和金
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 16 期2013 年 8 月 25 日计算机教育
Computer Education
中图分类号:G642
90
0 引 言
数据结构是高等学校计算机科学与技术相关专业的一门必修基础课,对于训练学生进行复杂程序设计和养成良好程序设计习惯具有重要作用。它上承计算机导论、程序设计语言、离散数学等基础课程,下启算法设计与分析和计算复杂性理论,是数据库、软件工程、编译原理、操作系统等计算机专业核心课程的先修课,只要学生毕业后还从事与计算机软、硬件开发相关的工作,数据结构的知识必然会或多或少地用到。此外,该课程中的很多结构和算法也是更高层次的计算机应用技术领域,如人工智能、模式识别、机器学习、网络信息处理、多媒体技术等课程的根基所在。
目前,数据结构课程的教学多以传授知识、描述抽象数据结构及其存储和算法为主,并辅以一定的上机实验。由于该课程知识点较多,且相对独立,许多学生在学完该课程后,大都能看懂数据结构的算法描述却无法针对实际问题设计相关的结构和算法[1]。案例教学是一种非常有发展潜力的教学模式,在课堂教学中,如果能够设计有具体应用背景及可满足不同层次学生需要的综合性案例,并指导学生对其进行积极的思考、分析、讨论和编程实现,将会极大地帮助学生深刻理解问题的原理和本质,起到举一反三、融会贯通的效果。
1 数据结构课程教学中的主要问题
数据结构是一门实践性很强的课程,其内容涵盖了线性表、栈、队列、数组、串、树、图、查找和排序等许多知识,目前的教学主要强调不同类型数据的逻辑结构、存储结构和基本运算的实现。由于不同类型的结构之间相对分离,知识点相互独立,学生在学习的过程中并不能很好地将课程的内容连贯在一起形成一个整体。另外,课堂教学中的举例一般只偏重于某个具体的知识点,使得课程综合性不够,而且与实际应用联系不够紧密。学生在学习该课程的过程中并没有学
文章编号:1672-5913(2013)16-0090-05
“数据结构”课程教学中的案例设计及应用
袁和金
(华北电力大学 计算机系,河北 保定 071003)
摘 要:针对目前数据结构课程教学中存在的理论与实践脱节,以及学生运用所学知识解决实际问题能力不强的问题,探讨案例在数据结构教学中的作用和意义,并以图的拓扑排序算法为例详细说明案例的设计方法和原则。
关键词:案例;数据结构;拓扑排序
作者简介:袁和金,男,副教授,研究方向为模式识别、计算机视觉,yhj_1977@。
第 16 期91
教育与教学研究
以致用的体会,兴趣不够,也没能形成融会贯通、举一反三的能力。虽然该课程也安排了一定量的实验环节,但一般只是将所讲述内容的伪代码翻译成高级语言,或是模仿课堂教学的例子完成一些简单的问题。因此,课程实验只是对教学内容的一个简单验证,并没能教会学生应用所学知识解决具体问题的思路和方法。
2 数据结构教学中案例的设计原则
案例教学是一种非常有发展潜力的教学模式,在激发学生学习积极性和实际应用能力等方面具有较好的效果。在数据结构课程的教学过程中,如果能够把有联系的内容相互串联起来并构成与实际应用相结合的综合性案例,启发和引导学生从不同的角度和深度进行分析、讨论和编程实现,将有助于学生形成比较完整的知识体系,并通过解决实际问题激发学生学习的兴趣和信心[2-3]。
精心选择的具有综合性和启发性的案例是案例教学的核心和关键。在设计和选择数据结构教学案例时要注意如下原则:
1)案例要结合教学内容。
案例中应主要涉及学生已学过或即将学到的内容。如果案例中所需的很多知识学生都不具备,他们会感到力不从心或无法下手,从而失去学习的信心和兴趣。
2)案例要考虑学生的个体差异。
案例应设有多个难度等级,不同程度的学生通过自身的努力,可以解决到不同程度的问题,也便于教师一步步地启发学生去分析和思考。
3)案例要难易适当、简繁相宜。
案例太简单,无法引起学生足够的重视,起不到讨论、分析和思考的效果,也不能满足程度较高学生的学习需要;案例太难太复杂,会使学生望而生畏,也不便于教师在有限的课堂时间内进行充分的分析和讨论。
4)案例应尽量与实际应用相结合。
通过简化的实际应用,能培养学生的学习兴趣和信心。“知之者不如好之者,好知者不如乐知者”,如果学生能够通过自己的努力解决了实际问题,他们会有一种由衷的成就感,其自信心和学习的动力会得到极大的增强。
5)案例要有综合性。
能尽量将不同的知识点综合起来,起到融会贯通的作用。
6)案例在精而不在多。
案例的目的是鼓励学生综合运用所学的知识、激发学生学习的兴趣和信心。因此,案例一定要精心设计和选择,教师一定要参与讨论,层层剖析,逐步深入。
3 拓扑排序及其应用的案例设计
这里以图的拓扑排序算法及应用为例,详细解释了数据结构教学中案例的设计方法和过程。该案例综合运用了图的存储、栈、队列、优先级队列、插入排序等相关知识,具有较强的应用背景。
3.1 案例的要求
案例名称:图的拓扑排序及其应用。
案例要求:已知某专业所有课程及课程之间的先导和后继关系,假设所有课程在每学期都能提供学生选修,学生每学期最多只能选6门课。编写一个为学生安排培养计划的算法,使之能用最少的学期数修完所有课程。
输入规范:
第一行为N, M 。N为课程总数,M为课程关系总数,课程编号从1到N。
下面M行,每行两个整数a,b。表示编号
2013
92
计算机教育
Computer Education 为a 的课程是编号为b 课程的前导课程。
输出规范:
第一行是最小学期数k 。
以下k 行分别是每个学期所修课程。如果有多种课程安排方式,取字典序最小的。
3.2 案例的分析
该案例要求编写一个算法,对给定的课程及其先导、后继关系,制定出学生的培养计划,具有较强的应用背景。该案例主要考察的是图的拓扑排序算法及其应用,同时也涵盖了栈、队列、优先级队列和排序等相关知识,具有较强的综合性。所谓拓扑排序是指将有向无环图中所有顶点排成一个线性序列,使得图中任意一对顶点u 和v ,若 E(G),则u 在线性序列中出现在v 之前。它在任务安排、工程项目管理等领域都有重要的应用,是图结构上的一个重要算法。
对于上面的案例,如果不考虑学生选修课程的学期、每学期的课程数和课程安排的输出要求,该问题就是一个简单的拓扑排序问题。以课程为结点、课程之间的先导和后继关系为边,建立有向图并对图中的顶点进行拓扑排序即可。其实现非常简单,具体可参见文献[4]中相关章节的算法(简称算法I )。该算法采用邻接表存储有向图,通过链栈来选择和保存拓扑排序过程中入度为0的顶点。文中已给出了详细的算法和实例,学生通过老师的讲解都能掌握和实现,这也是拓扑排序算法的基本要求。
显然,就本案例而言,直接应用上述算法并不能满足任务要求,需要对其进行进一步的改进。在这里需要考虑的问题主要有3个:(1)课程的排课学期及每学期选修课程数的限制;(2)在有多种排课方式时,输出取字典序最小的那个排课方案;(3)在最少的学期内修完所有的课程。
从上面的分析可以看出,该案例具有较强的
综合性,且可以根据需要解决的问题分为多个层面。教师在课堂教学时,可以引导学生根据个人能力不同程度地分析和实现该案列。下面分别就这3个问题逐步进行分析,讨论算法的设计方案。
3.3 案例的实现
3.3.1 考虑开课学期和每学期选修课程数限制的算法(算法Ⅰ)
由于题目中要求给出每门课程的排课学期及每学期选修的课程数最多为6门,所以在设计图的邻接表时,表头结点中除了课程的序号外,还应包括该课程的先导课程数和课程的排课学期。在建立图的邻接表时,应根据课程之间的先导、后继关系,自动计算出每门课程的先导课程数,并将每门课程的排课学期初始化为1,然后建立链栈保存先导课程数为0的课程。
为了确定每门课程的排课学期,在拓扑排序时,从链栈中取出先导课程数为0的顶点并输出之;然后从有向图中删除该课程所在顶点和以它为尾的所有弧,同时更新对应课程的先导课程数目。另外,如果某课程的先导课程数已为0(可以确定其排课学期了)且其排课学期小于当前课程的排课学期数加1,则将其更新为当前课程的排课学期数加1,具体分析如下:
q = ga[j].link; //q 是指针,指示以j 为尾的弧,j 表示当前要排课程的序号
while (q != NULL){
k = q->Successor; //顶点k 为j 的后继课程 ga[k].PrecursorNumb = ga[k].Precursor-Numb - 1; //k 的先导课程数减1
if (ga[k].PrecursorNumb == 0) //课程k 的先导课程都已安排
{
if(ga[k].term < (ga[j].term + 1))
ga[k].term = ga[j].term + 1; //更新课程k 的排课学期