《数据结构与算法》课程的教学方法研究与探讨
2017-12-15王竹婷孙欣欣
王竹婷+孙欣欣
摘要:《数据结构与算法》是计算机本科专业的核心课程,该课程的学习不仅仅可以进一步强化学生的编程能力,培养解决问题的思维逻辑,同时还为后续开设的专业课程提供处理问题的相关模型,在整个计算机专业的课程体系中处于非常重要的地位。但在实际教学过程,由于理论知识过于抽象,实践过程开展也困难重重,传统的课堂教学难以达到预期的理想效果,该文重点分析了该课程在实际教学过程中容易遇到的问题,并提出了相应的解决方案。
关键词:数据结构;抽象数据类型;教学改革;教学方法
中图分类号:G424 文献标识码:A 文章编号:1009-3044(2017)32-0186-03
《数据结构与算法》是计算机本科专业十分重要的一门核心课程。该课程旨在培养学生的逻辑思维能力,对现实问题的抽象能力,以及对算法的分析和设计能力[1]。一方面,抽象模型的建立和算法性能的分析要求学生具备较强的理论基础,很多内容涉及离散数学及概率方面的相关知识;另一方面,学习好该课程又可以为很多后续课程的学习打下扎实的基础,如在编译原理中会使用到栈、语法树和散列表,操作系统中运用队列和目录树管理进程和文件;数据库系统则运用线性表,链表及索引树等进行数据管理。因此,该课程被认为是计算机专业课程的重中之重。
但是,由于课程内容的高度抽象性,该课程的理论知识学生在课堂中往往难以消化吸收,大多教师希望能够借助实验环节为学生增强关键知识点的理解,甚至寻找与现实生活密切关联的案例演练给学生布置实验任务,却由于此环节对程序设计能力提出的较高要求与学生的实际能力差距甚大,不仅没有的达到预期的实验效果,反而更加挫败了学生学习的主动性和积极性,很多学生在学习过程中陷入了听不懂、看不透、学不会的困境。如何突破这种困境,是未来的教学研究工作中急待解决的问题。
1 《数据结构与算法》课程教学中存在的问题
1.1 教学内容构建不合理,学生学习困难
《数据结构与算法》的课程内容过于抽象,知识点繁多,缺乏连贯性与整体性。任课教师在教学过程中,往往也以数据结构的逻辑定义、相关数据运算为重点讲解内容,忽略了不同数据结构特性的比较,授课内容的前后之间缺乏关联性;同时也容易将其中的抽象模型与现实问题相剥离,复杂的理论知识缺乏事实依据,加重了学生学习的困惑。
1.2 教学方法应用不科学,教学手段过于单一
教师在教学过程中,如果一味的运用传统的广播式的教学方法,那么学生将永远处于被动听讲状态,就一般情况而言,在这种状态下学生集中精力听讲的平均时间大约在15分钟左右,但对于一门深奥难懂的理论课程而言,情况就更加不理想了。因此一名合格的授课教师不仅要合理的设计自己的教学内容,还应积极学习先进的教学理念,灵活运用多种教学手段,充分调动学生的主观能动性。
1.3 学生在短时间内难以领会课程精髓,教学目标难以达成
《数据结构与算法》这门课程一般在本科阶段大二开设,学生们刚刚完成一些公共基础课程的学习,对整个计算机学科的课程体系缺乏科学的认识,在他们看来该课程就是一门纯理论课。其中涉及到的众多抽象数据类型和复杂的运算方法已经让学生头疼不已,更不要提相关算法的时间和空间性能的分析。因此,绝大多数同学在学习这门课时,根本无法领会算法深层次的思想内涵。
1.4 缺乏对课程的正确认识,学习目标不明确
《数据结构与算法》课程的培养目标要求学生能够掌握各类抽象数据结构及其特点,并能实现从现实问题到抽象数据模型的转换,能够选择合理的数据结构和最优化的算法对现实问题进行求解;能够分析算法效率,包括采用哪种数据结构可以使算法的时间效率最高,哪种结构最省空间,时间和空间效率的折中方案是什么?算法的最好情况是什么?最壞情况又如何?这些都是《数据结构与算法》课程中应当讨论和解决的问题。分析清楚这些问题,是为编写高效程序所迈出的最关键一步。但事实上,随着目前软件开发行业的发展,框架技术的日趋成熟,学生无需理解底层技术,经过一段时间的技术学习也可以开发出应用软件系统,因此有相当一部分学生认为《数据结构与算法》并不重要。
1.5 编程基础薄弱,实验教学环节效果不理想
在学习《数据结构与算法》之前,学生应至少熟练掌握一种程序设计语言,因为绝大多数教材都是采用C语言或c++进行数据结构和算法描述的。虽然几乎所有的理工科专业都会在大一开设C语言课程,但学生的实际编程能力与《数据结构与算法》课程的要求相差甚远。几乎每一位任课老师实验课上都会遇到这样尴尬的情境,在实验任务布置完成,并讲解完算法核心思想之后,要求学生独立完成的编程环节,学生却无从下手。
综上所述,现阶段《数据结构与算法》这门课程在教和学的过程中都存在着较多的问题。由于理论知识点的繁多、抽象,严重挫败了学生学习的积极性,教学效果不佳。这一严酷的事实不仅仅存在于普通本科院校,即使是在学生素质普遍较高的211、985院校,《数据结构与算法》也是考试通过率较低的一门课程。因此,如何优化课堂设计、激发学生兴趣、提高教学质量是当前该课程改革研究的重点内容。
2 《数据结构与算法》课程教学方法改革措施
2.1 制定合理的课程规划
2.1.1 重视第一堂课
让学生重视一门课,教师就应充分重视自己的第一堂课,并将本门课程的在计算机专业中的核心地位深深植入学生的记忆中。很多教师一上来就向学生介绍“程序=数据结构+算法”,不错,这是一个非常经典的描述,但正因为经典所以内涵丰富,试想一个刚学完C语言的编程新手去理解这样的概念几乎是不可能的。所以,第一节课我们应尽量用简洁明了的语言去表述问题,让学生知道这门课程的重要性,去介绍这些专业概念,不如直接考诉学生《数据结构与算法》是考研必考课程,除此之外该课程的很多知识点也是大型IT企业招聘笔试、面试的必考内容。但同时同学们需要了解这门课程的学习是有难度的,很多同学因为难而在该学习的时候放弃了学习,却在考研、找工作之际重新捧起了《数据结构与算法》的教材,希望在座的同学们不要出现这样的情况。这样学生自然会对本门课程给予高度的重视。endprint
2.1.2 合理安排相关课程的教学内容和教学进度
《C语言程序设计》是学习《数据结构与算法》最重要的先导课程,建议教学机构在课程安排上应该注意一个合理的衔接,比如上完《C语言程序设计》的下一个学期立刻开设《数据结构与算法》,尽量缩短两门课程学习间隔的时间,同时相关的教学细节也应尽量合理设置。比如说,可以在上完《C语言程序设计》后安排一个c程序的综合设计训练,这个综合训练可以放在下学期一开学的前两周进行,等学生完成C语言知识的复习、巩固之后再立即开设《数据结构与算法》。
其次,《C语言程序设计》的教学目标不能与算法课程对于编程能力的要求相脱节。在教学内容安排上,尤其要注意对函数、指针、结构体等方面内容进行重点讲解和强化训练。再者,数据结构课程上如果学生遇到任何C语言方面的问题,任课教师也不能以不是自己的课程内容为由放任不理,而应该对学生比较容易出现的问题进行集中讲解和认真指导。
总之,《C语言程序设计》和《数据结构与算法》这两门课存在着天然的联系,无论是教学机构在课程安排上还是教学细节问题的处理上,都不应任意的隔断这种联系,否则对于教学果的影响将会是极为恶劣的。只有从宏观和微观的角度同时做好优化设计,才能促进教学质量的整体提升。
2.1.3 优化课程的结构体系
《数据结构与算法》的课程内容主要围绕数据的逻辑结构、存储结构和算法实现三条主线展开[2]。其中逻辑结构包括线性结构、树结构和图结构。树结构可以看成是多个线性结构组成的集合,图结构也是树结构的进一步拓展。数据的存储结构分顺序存储和链式存储两大类。同样的逻辑结构可以采用不同的存储结构,比如在线性结构中顺序表属于顺序结构、链表则属于链式结构,栈和队列可同时使用顺序和链式存储结构。
课堂知识点的讲解应当分清主次,不必面面俱到。但一定要对常用数据结构的应用场景进行介绍,并将其相关的算法特性进行对比分析,并注意前后知识点的连贯性。例如,顺序表的特点是查找数据效率高,但插入、删除效率低;链表的特性与顺序表恰恰相反;栈和队列则适用于一些特殊的场合,栈可以用来求解进制转换、迷宫问题,甚至编程时函数的调用都涉及函数调用栈。队列常用来对操作系统做进程管理[3]。让学生在循序渐进的学习中逐渐领悟,数据结构+算法才是程序的灵魂。
2.2 以先进的教学理念为指导安排理论课程教学
2.2.1 问题导入法
特定的抽象模型到底用来解决什么样的现实问题?为加深学生的理解,任课教师在课前可以先抛出一个现实问题。比如在讲稀疏矩阵之前,可以这样跟学生介绍:大家知道我们在淘宝或京东商城购买过商品后,这些电商平台都有一个智能推荐的功能,这个智能推荐是在分析用户购买或浏览行为相关的数据后得出的结论,要分析这些数据就要先存储数据,但电商平台的商品品种繁多,而用户购买或浏览过的内容却是极为有限的,采用传统的二维矩阵进行数据存储(行表示商品、列表示用户,不同行列号对应的矩阵元素代表某用户对商品的评分数据),会造成存储空间的巨大浪费,此时我们会考虑使用什么样的模型呢?与其他数据结构相比,稀疏矩阵貌似与我们的实际生活相距甚远,但通过这样的问题引入,再加上适当的课堂讨论,那么学生可能会较快熟悉这类模型。
2.2.2 开展翻转课堂
完成一个阶段性的学习之后,任课教师可以给学生布置一些大作业。比如,在讲完队列后,让学生去模拟练习一个银行的排队叫号系统,将全班同学分成若干小组,以小组为单位去完成同一个作业,每组中的每一名同学必须有自己特定的任务,并按时做出的成果汇报。在所有同学汇报完成后,展开讨论,让每组的学生代表总结,自己小组设计的系统与其他组相比有哪些优势,存在什么不足,应如何改进。最后,可以让全体同学投票产生推选出一个公认的最优系统,并对该小组成员予以平时成绩上的奖励。
2.2.3 将教学与科研、产学研相结合
任课教师必须要有自己的研究方向,将所传授的理论知识与自己的科研工作相结合,把先进的理论和技术引入到课堂中,同时注意加强与企业间的产学研合作,鼓励部分优秀的学生参与到企业项目中,真正做到用理论知识去解决实际问题,并将这些学生在企业的实践经历以交流会的形式向同学们分享,培养与树立学生领袖,激发学生的学习内动力。
2.3 实验教学环节的规范化设计
2.3.1 实验教学内容的规范化设计
《数据结构与算法》具有很强的应用性,实验教学教学环节的重要意义不言而喻,为达到良好的实验教学效果,任课教师首要完成的任务就是规范合理的设计实验教学内容。例如,实验一可以先进行一次C语言的综合性实验,为后续实验鉴定基础,后面再根据数据结构的难易程度依次安排,顺序表、链表、栈、队列、稀疏矩阵、二叉树、图、散列表,再做排序、检索算法,最后再安排一个综合性实验。除此之外,还应注意到学生的学习能力和应用实践能力具有明显的个体化差异,同样的实验内容有些同学完成的轻松、有些同学却无从下手。教师在布置实验任务时也要充分尊重这一客观规律,所安排的实验内容一定要丰富,并按不同难易程度进行分类,这样基础薄弱的同学可能会选择一些简单的验证型的题目,能力突出的同学则会选择难度较大的算法设计型的题目。
2.3.2 实验教学过程的规范化监控
实验教学与理论教学有着很大的差别,教师讲解的内容极少,以学生自己设计、编写、调试代码为主,但这一过程对于大多数学生而言并不是一件容易的事情,要让学生利用2个学时顺利地完成一次实验过程,课前必须做好本次实验的预习准备工作,并由任课教师监督管理,可以在上课前20分钟检查学生的预习报告,预习报告完成不理想的可以适当提问,并重点检查实验完成情况。实验过程中还应对学生在调试时产生的问题进行积极指导,并及时总结容易出现的问题。
2.3.3 实验报告的规范化要求及评价
每次实验结束后,要求学生撰写实验报告,实验报告应包括问题分析、数据结构选择和概要设计、详细设计、调试分析、测试结果及分析和附录(附上正确的源代码)。实验完成后指导教师会对实验完成情况和实验报告质量进行打分,该得分乘以难度系数即为本次实验成绩。这样同学们会为尽可能地提高自己的实验成绩选择难度较大的实验题目,并且实验报告的撰写,有助于加深对抽象数据类型及算法的理解,加深知识的巩固。
2.4 改革考核機制,加强教学过程监控
《数据结构与算法》具有很强的实践性,传统的理论考试无法对整个教学过程进行有效监控,也无法有效检验学生的学习效果和实践能力,因此对本门课程引入“总评=期末考试+过程考核+实验成绩+平时表现”的考核机制。其中,期末考试成绩占50%;过程考核占20%,主要包括阶段性的理论和实验方面的随堂测试;实验成绩占20%,是学生实验任务完成情况和实验报告质量的综合评价;平时表现占10%,是学生平时的到课情况、有无迟到早退、作业提交情况等总体评价。通过上述评价体系,有利于端正学生的学习态度,增强学生平时学习的积极性,而不是等到快考试了才开始突击学习。
3 结束语
本文首先分析了《数据结构与算法》教学中存在的问题,并提出相应的改进策略,通过制定合理的课程规划,以先进的教学理念为指导安排理论课程教学,规范化设计实验教学环节,改革考核机制,这几种方式改进现存落后的教学现状,提高教学质量。
参考文献:
[1] 贾代平,邹海林,吴丽娟. 数据结构对象化教学思想及其教学方法研究[J].教学与研究,2004(2):92-94.
[2] 张铭,许卓群,杨冬青,等.数据结构课程的知识体系和教学实践[J].计算机教育,2004(2):89-91.
[3] 张铭,耿国华,陈卫卫,等.数据结构与算法课程教学实施方案[J].中国大学教育,2011(3):56-60.endprint