前言:想要写出一篇令人眼前一亮的文章吗?我们特意为您整理了5篇数据结构与算法范文,相信会为您的写作带来帮助,发现更多的写作思路和灵感。
中图分类号:G642.0 文献标志码:A 文章编号:1674-9324(2017)23-0128-02
一、引言
1.地方高等院校应用型人才培养改革。地方高等院校的教学目标正逐步转型为以培养应用型人才为目标,课程教学方法及设置要求学生在学习过程中能学到与社会接轨的知识,从而能提高学生的学习兴趣,且在系统学习后,即毕业后进入社会能较快上手,从而培养出适应社会需求的应用型人才。
2.《数据结构与算法》课程地位。《数据结构与算法》是信息与计算科学专业的核心基础课程。数据结构的研究范围主要涉及数据的逻辑结构、存储结构和操作的实现,内容是程序设计(特别是非数值计算的程序设计)的基础,也是设计和实现编译程序、操作系统、数据系统及其他系统程序和大型应用程序的重要基础,是一门理论性强且实践性强的课程。通过这门课程的学习,学生在程序编写的过程中能够正确、合理地选择数据的存储结构,有效地设计算法,从而提高软件整体质量和效率。
3.本文研究方向。本文着重研究如何针对信息与计算科学专业的特点,地方院校培养应用型人才的教育模式,学生基础相对薄弱的情况,设计合理的教学方法,达到应用型人才培养的目的。
二、传统教学中存在的问题
笔者多年从事数据结构与算法课程的教学,经与学生进行沟通后,总结出传统教学中存在的问题有如下几点:
1.理论性强,知识点多。数据结构与算法课程的知识点多,理论性和实践性均较强,且有高度抽象的特点。故要求学生对程序设计语言和相应的数学知识掌握要足够深入,才能较好地学习。信息计算科学专业的学生数学基础较薄弱,学生反映,理论过于抽象且内容较多,越学后面越不懂,内容枯燥不易理解。
2.上机动手能力差。数据结构与算法课程中一个重要部分是上机编写程序实现算法,学生由于上一门程序设计课程还未理解,难将算法实现,体会不到编程的乐趣、算法的优美,在学习中易失去信心。
在上机实践观察中学生常出现两种情形:一种是理论尚未理解透彻,后续上机实践根本毫无头绪,不能灵活应用推广;一种是理论可以明白,但程序设计的能力跟不上,无法独立完现算法编写实现和调试,甚至无从入手去完成伪代码的书写。这两类学生占绝大多数,只有少部分学生可以较顺利地掌握教学内容并实现完整算法。
3.学生对数据结构的认识不够。外面有些培训机构的速成模式对学生的影响大,它们往往针对某一具体工具软件的使用,工具软件已经将许多知识进行了集成封装,使用者只需调用即可,不用关心具体实现步骤、方法和效率。而这些步骤、方法、算法效率的讨论都是数据结构中要学习的内容。学生认识不到数据结构的重要性,于是觉得这门课程没有应用的前途和学习的动力,不肯多花时间在上面去练习和实践,从而限制了自己后续能力的提高,比如改进算法的效率,优化程序等。
三、改革方法探讨
1.以理论教学为主,案例式教学为辅。针对应用型人才培养的目的和学生普遍反映的课本内容过于抽象的问题,可以选择一本以案例式教学为主的教材作为教学辅助教材。在讲授某个知识点前,布置学生在辅助教材中阅读,了解相关的应用背景。在预习过程中学生往往能发现一些问题,于是在课堂学习中将更有目的性和积极性去学习理论知识,有能力者甚至可以在课外尝试实现案例、发现问题。通过案例学习可以提高学生的学习兴趣,符合应用型人才改革的目标。学生也通过案例学习了解现实中出现的问题有哪些解决方法。当理论具体化后,在工作或后续学习中遇上实际问题将更有解决的方法和思路,而且再进行类比推广应用就比较容易。
但教学中又不能简单的以案例式教学为主。因为案例式教学的一个缺点是案例中涉及到的应用理论未必完全,而是某种模型结构的某些方面的具体应用。如树的教学,一般的课本对树的应用讲了六七方面,采用案例教学法,可能只面对几种应用。故教师在课堂上要将案例抽象出对应的结构,与理论结合在一起,详细讲解理论,即课堂上仍是以理论教学为主。
2.理论教学中知识点的筛选和难易处理。考虑到学院的学生基础问题,学生相应的数学知识掌握不够深入,若面面俱到地将所有理论全部讲完,将知其然而不知其所以然,也不符合应用型人才培养的目标,故课程内容要进行一定的筛选,后续课程中将出现的问题,不妨留到后续课程后再详细讨论。
比如,图的关键路径问题,对于基础掌握好的学生经过课堂学习确实可以掌握,但大部分学生或是不理解,或是理解后不能上机实现,而这一问题在离散数学课程中图论一章后有详细论述,那在数据结构中有限的课时中就不妨先简讲,多花时间在图的存储、遍历算法、最小生成树等算法上,效果会更好。
另外,教师在理论讲解中注意难易的处理。学生要是产生了畏难情绪,就容易造成前面的知识未消化,后面的知识更无从理解的学习障碍。据过往经验,数据结构线性表一章是比较简单的,其难点在于链表,接着的队和栈一章与线性表是一致的,仅操作方法不同。若学生在线性表上卡住了,再学栈和队列会觉得更难。于是教师授课时对一些基础又简单的问题,讲深入、讲透彻,配合传统的黑板结合粉笔效果更好,学生能有效跟着教师进行思考,注意归纳总结,虽然花时间多,但再学习后续知识时会触类旁通,学习自信心能提高,有利于形成良性的促进作用。
3.上机实践的难易处理和互动改革。上机实践主要是将伪代码的算法用具体程序语言实现、运行。应用型人才培养的目的就是要培养学生将理论知识用于实践,即能实现运行具体算法。故培养学生的动手能力是学好这门课程的关键。
在整个学期的实践处理上,实践难度安排由易至难。在前面的章实践作业中,给出的可运行代码应该较完整,留下关键部分让学生去编写,尤其是学会调试。随着章节的推进,给出的可运行代码逐步减少至不给。这样处理是可以让学生在初学时不至于无从入手,而且可以让程序设计基础不牢的学生有时间通过实践强化巩固,让学生获得编程乐趣。
另外,上机实践时可将学生分成若干小组,每个小组选出一个学习较好的学生为组长,上机中组长可以帮助组员进行程序的调试和讲解,使学生能够阅读程序理解程序所表达的意义。学生对知识点理解的角度和教师的角度可能不同,有时候同学请教比教师更能让他们接受,从现实课堂中反映,学生确实更愿意向同学请教。
组员们在讨论中产生解决不了的问题,再与教师讨论得到解答,这样的互动改革既可以有效解决教师逐一回答时间有限的问题,又可以提高学生的学习热情,学生之间不断相互学习共同提高,真正让大家都能动起手来,锻炼编程能力和举一反三的自学能力,为将来到社会工作打下扎实的基础。
教师在指导中要引导学生学会读懂程序错误提示,自己调试修改程序,提高学生实践水平。加强对学生举一反三能力的培训,让实践教学反哺理论教学,使学生对理论有更深层次的理解。培养学生良好的程序编写习惯和风格,注重程序注解。
4.开展课外讲座。在课外,邀请已学过这门课程的学生和正在学习的学生进行经验交流。尤其是一些已经参加工作的学生,他们可以带来更多的实际案例,这些案例比教材中提供的更新颖、更具体,涉及到更全面知识的融会贯通,而且他们可以提供工作中有关《数据结构与算法》这门课程的经验,可以让学生们了解与社会接轨的知识,提高学生的学习兴趣。
四、总结
近年毕业生就业问题日趋严重,通过上述讨论发现,传统数据结构与算法课程的教学形式已不能满足现阶段实际要求,地方高等院校如何进行应用型人才培养改革,培养出适应社会需求的应用型人才成为研究重点。本文以地方院校信息与计算科学专业的《数据结构与算法》课程为例,探讨一系列的教学改革措施,以达到应用型人才培养的目标。
参考文献:
[1]余腊生.石献.基于创新理念的数据结构教学方法探讨[J].计算机与信息技术,2006,(11):110-114.
[2]李克清.《数据结构》课程中的案例教学初探[J].长江大学学报(自科版),2004,12(1)4:135-136.
[3]严蔚敏.吴敏民.数据结构(C语言版)[M].北京:清华大学出版社,1997.
A Study on "Data Structure and Algorithm" Curriculum Reformation
LI Ting,XU Hong-ru
(School of Mathematics,Jiaying University,Meizhou,Guangdong 514015,China)
【关键词】数据结构与算法 实验改革 平台建设
【中图分类号】 G 【文献标识码】A
【文章编号】0450-9889(2014)07C-0132-03
数据结构与算法实验是计算机专业学生必修基础课数据结构与算法的配套实验课程,是培养学生程序设计技能必不可少的重要环节。其目标之一是培养学生能运用理论知识与算法技术分析解决实际问题,能运用高级程序设计语言编程实现算法。从近年实验情况来看,在上机编写程序实现具体算法时遇到的种种问题,效果不容乐观,学生很难按时完成实验所要求的内容。
一、实验教学存在的问题与分析
数据结构与算法实验是一门实践性很强的技术基础课,经过多年实验教学分析,发现普遍存在如下主要问题:
(一)课程抽象,实验难度大
数据结构具有一定的抽象性,学生面对抽象概念在学习过程中常会遇到困难,基本每本理论教材在呈现概念时都会受到多方面限制,比如篇幅的限制,省略了算法细节部分或只给出伪代码,由学生自己补充,学生需要将算法用程序设计方法实现,完成有一定难度和技巧的程序设计并上机调试运行。对编程基础稍微薄弱的学生来说,就会出现不小的困难。
(二)实验相关资料偏少
由于学生基础薄弱,实验前又没有更多的相关实验资料进行预习,仅靠看课本理论和实验时的几个学时难以完成实验所要求的任务,也就谈不上创新人才的培养。
(三)学生程序设计语言课程基础薄弱
数据结构与算法课程是第四学期开设,对于很多先修课程要求高,高级程序设计语言是大学生进校第一、二学期学习,第一学期学习过程序设计思想,第二学期学习面向对象程序设计思想,由于大部分同学高中没接触过计算机语言学习,对过程程序设计思想还没掌握透,第二学期的面向对象程序设计学习又开始,学习非常吃力;导致常用的一些语法结构,如指针和结构体等内容难于理解。而这些语法恰恰是程序设计语言教学时的难点,也正好是学生完成数据结构实验必须掌握的内容,这给部分学生学习带来了一定困难。
(四)编程语言难
数据结构与算法编程语言描述主要用到C++语言,并大量用到了指针、链表和结构体等运算,这部分内容正好是大多数学生掌握知识点薄弱的环节,导致学生很难用高级语言将教材中的算法描述出来,由于问题的堆积、实验的欠账,容易使学生丧失学习兴趣和信心,导致学生间抄袭程序或实验报告的现象。
(五)编程技巧差
普通学生在低年级只编写过功能单一、结构简单的程序;而从功能单一的简单程序向涉及算法和稍复杂程序的数据结构编写过渡学习时,需循序渐进的方式和细致的引导,紧密结合理论教学。学生一下从简单编程直接到复杂的程序设计,不仅不适应,且设计技巧性较差。
二、实验教学改革目标的提出
根据以上学生实验时出现的诸多问题,特提出该课程的实验改革目标:
一是紧密配合理论教学,通过相关实验,帮助学生加深对数据的逻辑结构、存储结构、算法思想和具体实现等各个环节的整体理解,强化学生“结构――算法――编程”三者密切相关的意识,让学生思考和发现利用数据结构解决实际应用问题的有效方法,从而使学生分析和解决问题的能力得到锻炼和提高。
二是因材施教,让原本不同水平和能力起点的学生通过数据结构实验,能力和水平都有所提高,并且有兴趣有信心学好数据结构课程。
三是培养学生多方面能力,比如团队精神,口头表达能力,对学生全方面发展起到较好的推动作用。
三、调整实验项目内容,使其更加符合学生的认知规律
数据结构与算法实验内容主要是编程实验,提高学生的实践编程能力,巩固和强化理论课的教学效果。为了保证和提高实验教学质量,加深对课堂知识的理解,培养学生动手能力和思维能力,尝试对数据结构与算法实验项目进行重新设计,主要内容有:
针对编程基础较薄弱的学生,我们开发了数据结构与算法实验教学平台,学生在该平台上可获知实验相关的更多内容,通过平台引导学生重点回顾程序设计语言的基础知识,特别是数组和指针等有关操作。通过这些辅助手段,使学生对将要编写程序的一些语法和程序规则有所复习和掌握。还可通过平台对实验原理的动画演示,得到帮助和启发,从而更好更快地完成实验内容。
每个实验内容以章节为单位安排,依据实验教学目的,针对计算机相关专业所要达到的不同实验教学目标,以及考虑学生个体差异,每个实验项目都设置基础必做题和附加选做题两部分内容。这两类实验都需要紧密结合理论教学。必做题相对简单,目的在于帮助学生掌握基础知识。对于该部分题目,学生容易完成,能提高学生学习积极性并增强学习信心;选做题针对学有余力的学生,各个实验项目中的必做题均设计详细的实验准备内容,用于引导学生更好地进行实验前预习准备工作;主要在于培养和鼓励学生的学习兴趣和扩大知识面,进一步培养学生应用能力和创新意识,保证基础弱的同学学习兴趣,也提高了编程能力强的同学动手能力。例如,与线性表一章理论教学相配合的实验项目是多项式加减法,这个实验是对线性链表的建立、插入、删除、遍历等进行综合运算,对数据结构与算法第一实验内容来说稍有难度,可作为选作题或增加实验学时。在与栈一章理论教学相配合的实验项目是迷宫,这部分实验内容要求掌握回溯法和栈的基本运算等知识,有一定难度;用括号匹配作为必做题,能培养学生独立钻研,有助于学生解决问题能力的训练。
四、实验教学方法探究
实验前学生必须先预习和熟悉实验教学平台,了解实验内容的目的和要求,理解算法,描述语言的语法,查看相关资料,写预习报告。
通过多年实验教学中实验完成情况分析,软件工程专业的学生语言掌握较好,大部分学生能按时完成实验项目,其它专业的学生实验完成情况较差;由此,实验编程语言可以因学生而异,除软件工程专业的学生采用面向对象程序设计C++外,其它专业主要采用C语言描述,并且可增加前期语言学习时间。只有编程语言掌握扎实,数据结构与算法实验才能很好地完成。
开发数据结构与算法实验网络教学平台系统,该平台主要包含有课程介绍、在线课程、互动学习、下载资料等模块。有针对性地对每一个实验项目进行详细讲解和实验原理分析的动画演示,将抽象的数据结构问题制作为教学动画,借助形象的案例理解抽象的概念。教学内容利用Web页面为基本元素出现在站点中,学生通过访问站点来进行交互式学习。以辅助学生自主学习为主要目的,解决学生实验时无从下手的局面,启发学生思维,促进学生程序设计能力的提高。平台系统流程图如图1所示。
在线课程是教学平台核心部分,也是学生对数据结构与算法实验加深理解的重要环节,该平台从实验预习,到实验原理算法的演示,再通过在线课堂的视频教学、在线测试题训练及各种原理进行拓展教学。为了方便学生学习较抽象的数据结构与算法,能顺利进行程序编写,该教学平台还包含有18个flas用于原理算法演示,主要包括栈和队列、线性表、递归、查找与排序、树、图等内容,每个flas都有实验原理及主要代码实现过程,能更加形象展示数据结构的原理。例如:栈是一种先进后出的数据结构,在对栈原理进行动画设计时,根据用数组实现栈的特点,采取对栈先进行初始化的代码模块来对栈进行初始化,之后运行相应代码模块观察压栈出栈过程,同时还能观察到栈中数据的变化。在大部分flas演示过程中,flash页面左侧是代码部分,能体现当前执行的代码,并与右侧的动画演示及讲解分析一一对应。演示过程中如用户需要重新开始,还可点击“重新开始”按钮。这些flas演示将代码与动画有机的结合在一起,将抽象的代码转换为有形的动画,大大方便学生学习和对实验内容的理解。
如对栈原理进行动画演示的flash点击界面中压栈代码动画效果,该动画效果包括等待入栈的数字入栈的动画效果和位于等待区域的数字前移的动画效果。等待入栈的数字、入栈的动画效果和位于等待区域的数字前移的动画效果如图3所示。
图3 压栈的动画效果图
该平台互动学习是一个教师和学生互动的场所,实现动态交互的功能,教师能添加、更改、删除各种资源,学生、教师可以查看各种资源库里的资源。同时,学生可从平台上下载练习题和测试练习题资料,练习题有主要算法描述,可帮助学生进一步理解每个章节的算法原理,测试练习题有自动报错功能。
五、改革数据结构实验考核方式
让学生对以前所做实验作一个分析和总结。具体操作方案如下:首先将学生自由分组,小组成员共同从以前做过的实验项目选做题中选择一个进行程序的分析设计和编码实现,要求考虑程序的编写规范,程序的执行效率等方面。考核时,由实验教师从该小组随机抽取学生到讲台进行讲解和演示,根据程序完成情况和学生演示情况,决定该小组成员的平均得分,而每位学生的具体得分由小组成员内部根据该学生在该程序实现中的工作情况决定。通过这种方式,能培养学生的团队意识,达到互学互助的效果,同时也锻炼了学生的表达能力。
数据结构与算法实验环节教学改革的创新之处在于依托一门编程语言以及所开发的实验教学平台,因材施教,根据不同专业实际情况,综合考虑进行实验项目、实验内容和实验准备的合理设置,帮助学生在实验课上找到自己的最好学习方式,提高实验教学质量。
【参考文献】
[1]吴兵.高校计算机文化基础课程网络学习题库的研发[J].实验技术与管理,2011(2)
[2]朱洪浩.数据结构课程“工程化”实践教学模式研究[J].赤峰学院学报(自然科学),2013(15)
[3]马晓波,王翠茹.《数据结构》实践教学改革探讨[J].内蒙古农业大学学报(社会科学版),2010(02)
关键词:算法与数据结构;案例教学;算法可视化;能力培养
作者简介:郑恭明(1980-),男,重庆人,长江大学电信学院,讲师。(湖北荆州434023)
中图分类号:G642.0 文献标识码:A 文章编号:1007-0079(2012)08-0083-01
“算法与数据结构”是计算机软件编程技术的核心课程,也是电子信息类专业的软件基础课程。该课程不仅要注重提高学生对数据结构理论的理解,锻炼学生抽象思维和研究创新能力,更要注重培养学生的动手实践能力,使学生熟练掌握组织、存储和处理数据的方法,并编写出正确、清晰和高效的算法程序。本文从本院大类招生以来“算法与数据结构”课程教学的实际出发对理论教学和实践教学进行了相关探索。
一、该课程存在的问题
“数据结构”课程比较突出的特点是:[1]概念较多、理论性强、内容抽象、逻辑性强、程序复杂。教学实践中发现,学生中普遍存在概念不清的问题,学完课程后对数据结构的本质不能有清晰的认识和准确理解。主要表现在以下几个方面:觉得算法理论太抽象,逻辑性太强,难理解、难掌握、有畏惧感;内容多,概念多,学习中难以把握整体内容,学完后不知道到底学了些什么、感觉在课堂上思路跟不上,难以消化;上课算法理论听得懂,上机实验实现算法时觉得无从下手,当编程解决实际问题就感觉更难了;不知道学习算法在实际中有什么用,逐渐失去了学习兴趣;教材上的算法多,难以全部上机实现;不重视上机实验,觉得能读懂算法和书面编写算法就可以了。
以下是几个较为典型的例子:链式存储结构中的指针,定义上是指向相关类型节点的变量,在存储结构上则对应存储对象的地址;数组结构与计算机语言中的数组相混淆,数组结构是一种逻辑结构,与计算机内的表示方法无关,而计算机语言中的数组则只是一种顺序存储方法;排序中的稳定问题,不能掌握其实质,在不同比较公式(大于,大于等于或小于、小于等于)下等值关键字在排序过程中是否交换顺序。因此,在备课时就应对诸如此类易于模糊的概念和细节高度重视;讲授时要清晰地阐述和辨别,消除学生的畏惧;精心选择上机题目,让学生正确地理解概念并能在实践中灵活运用。
二、理论教学探索――结合专业特点整合课堂内容
在理论教学中,引入跟专业背景相关的实际和经典案例打破以抽象和枯燥知识点为界线的授课模式,提高学生的学习兴趣;在授课形式上采用多种表达方式,特别是制作了直观的核心算法Flas和动态演示软件,使学生较好地理解抽象、逻辑性强的复杂程序。
1.案例教学
以前“算法与数据结构”教学是按章节安排的。首先讲解本章节的基本理论知识,然后介绍各种算法的基本实现(在不同存储形式下算法的实现形式),再分析各个算法的优缺点等。这种填鸭式的方法只注重了“教”,而忽略了“学”的方面;症结就在于学生并没有真正地参与到教学中来,教学效果不理想。
为了改善这一情况,在教学中引入案例教学法,[2,3]其核心在于:在讲授某一知识理论之前,以实际的案例作为切入点,教师围绕所提供的案例,引导学生积极思考、分析、讨论和实践,从而深刻理解问题的原理和本质。“算法与数据结构”以案例为核心的教学基本思想是:按照逻辑结构给出其相应的案例及相关预备知识;教师解释案例并引导学生理解案例;学生根据案例学习数据结构知识并解决案例。
比如:线性表中引入多项式加法和约瑟夫(Joseph)问题等案例;栈与队列引入渡船调度和农夫过河案例;树和二叉树引入通信编码压缩案例;图引入学习课程的拓扑排序案例等。这些案例既能把理论知识寓于其中,又跟电子信息类的专业特点相结合,从而调动学生的主动性并培养其探究性的学习态度,切实地参与到课堂中来积极思考,以真正地掌握所学的科学技术知识,提高分析问题和解决问题的能力。
2.可视化演示关键算法
对于抽象的算法特别是关键算法演示采用Flas和动态演示软件等可视化教学手段。可视化教学是指在计算机软件与多媒体技术的帮助下,将被感知、被想象、被推理的事物及其发展变化的形式与过程,用仿真化、模拟化、形象化、现实化的方式,在教学过程中尽量表现出来。可视化教学可以使学生直观地观察、体验、发现、干预,利用这些生动的信息化了的知识模型,培养和造就学生的认知能力与创新能力。可视化教学在数据结构算法教学过程中所表现出的优点有:[4,5]可改变传统教学方法中的枯燥乏味局面,吸引学生的注意力;它可将文字、数据、图片、影片等多种媒体动态地整合在一起;它可以让学生体会在大量不同的数据结构下,算法执行效率的差异;学生可课后利用实现算法的可视化教学软件探索算法的执行过程,培养学生个别化学习与自学的能力。
例如:讲解二叉树的查找、遍历、线索化、哈夫曼树及编码、图的拓扑排序、关键路径及排序算法时,制作了Flash的算法动画演示系统和动态显示软件,通过动画演示,学生对各抽象的逻辑操作过程有了清晰直观的理解,达到了很好的教学效果,增强了学生对数据结构中各算法的理解和掌握,从而克服了学生学习过程中的畏惧情绪,促进了学生学习兴趣的提高,达到教学目的。
三、实践教学改革
实践教学是理论教学的延续和扩展,更是培养学生分析、解决问题能力的重要手段,并培养学生具有一定的编程能力以及解决实际问题的能力。课程中涉及大量C语言中的指针运算,这又是C语言学习的重点和难点,大部分学生对这部分知识点掌握不是很牢固,用起来也比较生疏。课本上的例证又有很多类C代码的描述语句,这加大了学生理解和编写程序的难度,导致很多学生对算法的思路是清晰的,但也难以用C语言将算法描述出来。
在实验上机这个实践环节老师就要帮助学生解决两个问题:用案例引导学生应用所学知识来给出切实可行的解决方案;提高学生编写程序的能力,特别是类C代码转化为C语言的能力。
要解决这两个问题,在理论教学时就开始着手。首先是案例的引入,除了调动学生的兴趣和积极性之外,更重要的是提高学生分析、解决问题的能力――给出的问题提出可行的解决方案;其次是在算法的可视化教学中,所有算法用C语言来描述,并跟类C代码进行比较提高学生编写程序的能力;最后在实验内容和设置上紧跟理论教学的案例并进行适当的扩展和提高,让学生能更好地理解知识点并能加以运用来解决实际的问题,提高编程能力。
四、过程的动态跟踪
在整个教学活动中,答疑、作业和实验上机是掌握学生学习状态的重要手段。除了每周固定的答疑外,还有课程的学习网站留言和交流,这既是课堂的有益补充与延伸,也是了解学生学习状态和收集课堂反馈信息的主要手段,有助于教师及时地调整教学的进度和方法,以达到更好的教学效果;作业既可以发现普遍存在的问题,也可以了解一些学生的独到思维方法,然后一起提出来共同讨论、理清思路、加深理解,从而督促学生独立学习,有利于学生学习兴趣的提高和良好学风的形成;上机实验不仅可以发现学生编程上的不足,同时还有助于发现一些平时能写出比较好的程序或能在课余时间自己编写一些优秀的应用程序的学生,因材施教,提高学生的综合素质和竞争力。
五、总结
笔者从“算法与数据结构”的课程体系和专业的特点出发,把知识体系传授和提高学生以工程实践能力为主的综合素质紧密结合,以案例引入打开思路,结合教学内容培养学生对问题的分析能力和实践应用能力,从而达到提高该课程的教学效果的目的,并取得了良好的效果。
参考文献:
[1]严蔚敏,吴伟民,等.数据结构(C语言版)[M].北京:清华大学出版社,2007.
[2]宗瑜,金萍.案例教学法与《数据结构》教学改革[J].皖西学院学报,2009,(2):30-32.
[3]徐翠霞,崔玲玲,邵回祖,等.数据结构案例教程(C语言版)[M].北京:北京大学出版社,2009.
关键词:案例教学;数据结构;教学法
0.引言
当前高校教学改革的主要目标之一,是改变传统的以教师为中心的教学模式,构建一种既能发挥教师的指导作用,又能充分体现学生学习主体作用和个性化学习的新型教学模式。为实现这个目标,教师应积极利用计算机进行教学活动,并在此基础上逐步实现教学模式、教学内容和教学方法的改革。同时,多媒体和网络技术为构建新型的教学模式及实现网络教学中“以问题为中心”的教学模式提供了基础。另外,以问题为中心的案例教学是目前比较流行的一种教学方法,即学生利用所学的知识和技能解决一系列实际问题,从而达到建构经验的目的。案例教学强调把学习设置到有意义的问题情境中,通过学习者的相互协作来解决真正的问题,从而有效地学习隐含在问题背后的科学知识,增强解决问题的技能和自主学习的能力。
1.数据结构与算法课程知识体系
数据结构与算法是程序设计、操作系统、数据库原理与设计等课程的重要基础,在计算机科学与技术专业课程体系中占据非常重要的地位,是一门理论与实践并重的课程。该课程内容丰富、概念多、高度抽象、综合性和实践性强,这些因素给教学带来了较大难度,教学效果是否良好将直接影响学生数据抽象能力和程序设计能力的培养。以问题为中心的教学法,综合了自主学习、发现学习、协作学习、综合学习等多种学习方式的优势,对激发学生学习兴趣、学习自主性和创造性,培养学生的协作精神与自学能力均有较好的效果。为了帮助学生在掌握课程知识的同时获得探究式学习和团队协作能力,提高教学效果,我们在此课程中开展了以问题为中心的案例教学研究。
该课程的教学体系以数据元素之间的逻辑关系为主线,以线性表、树、图等为分支,以不同逻辑关系的逻辑结构特点、存储结构以及操作算法和算法实现作为基本知识点,每种逻辑结构都有其实际应用,知识体系结构层次清晰,示例丰富,适合开展以问题为中心的案例教学。因此,我们从中选取了“栈”“队列”“二叉树”及“图”的应用等内容作为教学单元开展教学研究。
2.以问题为中心的案例教学实施过程
我们在教学过程中选取适合以问题为中心的案例教学单元进行方案设计,针对数据结构与算法课程创设教学环境,借助网络教学平台实施案例教学,最后进行教学效果的评测与总结。在具体的工作过程中,我们按照探究未知知识领域的途径,通过提出问题、分析问题、创造性地解决问题、知识迁移等步骤对该教学方式予以实施,如图1所示。该课题已于2011年9月至2011年12月、2012年9月至2012年12月分别开展了2个学期、4个班的教学实践。
下面以“哈夫曼算法的应用”为例阐述以问题为中心的案例教学过程。
(1)明确学习目标与要求。本单元的教学要求为掌握树的带权外部路径长度的计算,掌握哈夫曼算法的主要思想及哈夫曼树的构造,掌握哈夫曼编码。
(2)创设情境,提出问题。问题情境指学生在问题教学中所面临的一种“有目的但不知如何达到”的心理困境。问题情境就是一种心理状态,即学生接触到的学习内容与原有认知水平不和谐、不平衡时,学生急需解决疑难问题的心理状态。例如,教师提出在电文发送系统中,如何设计电文编码,使发送的码长最短?发送邮件附件的时候,经常进行文件压缩,如何实现文件压缩?
(3)分析问题。学生明确要探究的问题之后,在网络教学平台上学习“哈夫曼算法”相关知识,如二叉树、树的带权外部路径长度、哈夫曼算法思想、哈夫曼编码等,拟订出问题的解决方案。
(4)解决问题。学生通过自主学习,明确哈夫曼树是带权路径长度最短的二叉树,并作哈夫曼编码,得到的码长最短。因此,在电文发送系统中,利用哈夫曼算法设计电文编码,使发送的码长最短。同理,也可以使用哈夫曼算法对文件进行压缩。
(5)知识的迁移。哈夫曼编码在数据编码中的应用是哈夫曼算法应用于各项技术中的典型实例。此外,由于哈夫曼树具有带权路径长度最小的特性,它还能应用于其他具体的事物决策中。
①图像压缩问题。大数据量的图像信息会给存储器的存储容量、通信干线信道的带宽、计算机的处理速度带来极大的压力。单纯靠增加存储器容量、提高信道带宽和计算机的处理速度等方法来解决这个问题是不现实的。此时需要考虑压缩,压缩的关键在于编码。对于数据进行编码时出现频率较高的数据,编码器输出较短的码字,而对于出现频率较低的数据,则用较长的码字表示,从而实现压缩。通过对哈夫曼树的原理及应用的研究,我们可以在遇到某些具体应用问题时获得启示和解决思路。
②二叉查找树。例如,成绩表有10000个分数,学生成绩在5个等级的分布如表1所示,要求设计查找树。
根据分数比例(当做权值)设计出哈夫曼树,如图2所示,即为二叉查找树,靠近根的结点表示大比例分数段。通过计算,在查找成绩时时间性能上有很大的提高,类似的问题可以通过二叉树对此进行更深入的研究。
(6)教学实验。教学实验是对学生综合素质进行训练的一种基本方法,是课堂教学的一种延伸,是必不可少的一个教学环节。编程中的问题往往比平时的习题复杂得多,也更接近实际。编程能使学生所学的知识“活”起来,达到深化理解和灵活掌握教学内容的目的。同时,编程也是对学生软件设计综合能力的训练。本单元教学任务完成后,学生以小组为单位进行综合实验。
①实验目的:了解哈夫曼树的应用,掌握哈夫曼树的构造方法及哈夫曼编码的应用。
②实验步骤:
a)输入一串字符,模拟电文发送系统中的发送字符,统计其中所有的不同字符及其个数,得出每个不同字符在文中出现的频率。
b)根据每个字符频率建立哈夫曼树,输出字符的编码,模拟电文系统中的编码系统。
c)输入一个0.1字串,得出其译码,模拟电文系统中的译码系统。
③实验要求:按组完成实验,填写实验报告,汇报程序运行过程、结果等。
(7)对本次案例教学结果进行检验。教师完成一个阶段的教学任务后,应重点检查学生对知识点的掌握情况。另外,教师还应该定期检查每个小组的团队学习情况并打分,对协作效率较高的小组给予肯定和表扬。
教师在收集、整理分析教学结果的基础上,要对本单元专题的教学试验进行反思,肯定成功的经验并推广;对存在的问题认真分析原因,并提出改进措施和解决办法;依据反思结果,及时调整和修改后续学习单元的教学方案和教学策略,以期在下次教学试验中取得更好的教学效果。
3.教学效果测评
在课题的实践中,我们对案例教学效果的评价包含两个方面:对学生而言,主要从知识点的掌握程度、理解程度和是否能独立地应用数据结构与算法解决实际问题,以及能否动手实现具体的应用等指标来进行评价;对教师而言,主要从教学效果方面进行评价,综合评价各个因素。因此,提高对案例教学重要性的认识,客观准确地评估案例教学的效果,培养学生综合能力,促进案例教学质量的提高,具有十分重要的意义。
在数据结构与算法课程中开展以问题为中心的案例教学方式深受学生欢迎,也获得教师们的好评。
1)学生成绩评价。
(1)总结性评价——期末考试情况。图3是2008-2010级计算机科学与技术专业学生数据结构与算法期末考试成绩的比较图。
从图3可以看出,采用以问题为中心案例教学法的2010级学生总体考试成绩比2008级和2009级要好,及格率及平均分普遍都高。
(2)形成性评价——实验作业及分组汇报情况。图4是2008-2011级计算机科学与技术专业学生数据结构与算法课程实验作业及汇报情况比较图。
从图4可以看出,采用以问题为中心的案例教学的2010和2011级学生平时学习表现总体比2008和2009级要好,优秀率及良好率占的比例都较高。
2)教师表现评价。
经过课题研究组成员的多次探讨,教师们编写了许多有代表性的教学案例,并在课堂上加以实施。学生在网上评教时给相关任课教师的评价达到优秀等级,课题研究组教师授课表现也得到上级领导及教学专家的好评。例如,2010年,案例教学“二叉树”获得学院讲课比赛第一名;2011年,以问题为中心的案例教学“图的应用”获得学院讲课比赛第二名;2012年,课题组一位老师以问题为中心的案例教学“Kinect的应用”在学校讲课比赛中获得全校第二名。
关键词:数据结构;算法;软件设计
【中图分类号】TP311.12-4;G642
一、数据结构与算法概述
1.1数据结构
数据结构是一门研究数据的逻辑结构和存储结构(物理结构)以及它们之间的关系的学科,且为该结构定义相应的运算设计相应的算法。这里的数据是指可输入到计算机能被程序处理的符号的集合。其中,数据的逻辑结构是指数据之间逻辑关系的描述,逻辑结构的分类有线性结构、树形结构和图结构。数据的存储结构是指数据在计算机中存储结构,也称为物理结构,在程序设计语言中,数据结构直接反映在数据类型上,比如一个整型变量就是一个节点,根据类型给他分配内存单元。
1.2算法
1.2.1算法是由基本运算及规定的运算顺序所构成的完整的解题步骤。计算机算法与数据结构之间的关系,算法最终依附于数据结构,数据结构直接影响算法的选择和运行效率。运算是计算机完成的,这就要设计计算机在操作时对相的一些操作模式,如插入、删除和修改的算法。也就是说,数据结构还需要给出每种结构类型所定义的各种运算的算法。
1.2.2算法与数据结构研究的目的简单地说就是优化代码,提高程序执行效率。比如,把一堆无顺的数据通过一个算法实现顺序排列实现方法太多太多,但是也许运行速率最快的占用的存储空间很大也许运行速率不是很快的占用的存储空间却很小,所以要通过算法与数据结构分析。
二、数据机构经典算法的选择
选择经典算法的重要性,PASCAL语言的创始人、著名的计算机科学家N.沃思说得好“程序=数据结构+算法”,足以见得算法在程序设计中的重要地位。在合理的数据结构基础上,算法是对数据结构的操作(运算),是数据处理的核心。数据结构中所讲的基本数据结构有线性表、堆栈、队列、数组、树、二叉树、图以及相应的算法。一个算法是建立在某种数据结构的基础上,一个算法不可能脱离数据结构而孤立存在。只有通过分析算法,才能真正掌握某种数据结构。一个经典算法往往能起到以一当十、以点带面的关键作用。选择好经典算法后下一步就是要对其展开综合分析,下面以具体的算法为例进行讨论。
三、利用经典算法说明基本原理
3.1经典算法应能体现某个数据结构的基本特征
我们知道线性表顺序存储时其优点是能够对每个数据元素随机访问,存储密度高,其缺点是插入、删除操作时需要移动大量的数据元素,操作效率低。“向有序(由小到大或由大到小)的线性表(顺序存储)插入一个新的数据元素”,这一经典算法集中反映了线性表顺序存储的这些特点。
分析:将一个值为X的数据元素插入到有序(由小到大或由大到小)的线性表(顺序存储)中,可以分两步进行,首先查找到值为X的数据元素在线性表中应有的位置,采用从头到尾循环比较的方法确定其位置I,然后,将第I个以后的全部数据元素向后移动一个存储单元,最后将值为X的数据元素存放到第I个位置上,线性表元素个数增1。
【算法1】
PROCEDUREINSERT(V,m,n,X)
//将值为X的数据元素插入到V数组中,(线性表顺序存贮在V中)m为最多元素个数,n为当前实际元素个数IF(m=n)THEN{“OVERFLOW”;RETURN}FORI=1TOnDO
IF(X〈V(I))THENBREAK
FORJ=nTOIBY-1DOV(J+1)=V(J)V(I)=X
n=n+1
RETURN
分析:【算法1】的优点是简单,便于理解,缺点是:①循环体内有提前退出语句,不利于结构化程序设计;②确定新数据元素位置和移动数据元素分两步进行,有重复操作,可以改进之,将两步合并一步完成,即将循环比较与移动数据元素同时进行。从线性表的尾部开始向前循环比较,比新数据元素大者后移,直到小于等于时停止。
【算法2】
PROCEDUREINSERT(V,m,n,X)
IF(m=n)THEN{“OVERFLOW”;RETURN}
I=n
WHILE(I〉=1)AND(V(I)〉X)DO{V(I+1)=V(I);I=I-1}V(I+1)=X
n=n+1
RETURN
分析:注意【算法2】中循环条件,当循环结束后I=0或V(I)〈=X,新数据元素的位置为I+1,【算法1】的时间复杂度为0(2n),而【算法2】的时间复杂度为0(n),效率提高一倍。循环结构是结构化程序设计中最基本最核心的部分,归纳循环条件是关键。【算法2】能进一步推广。
3.2利用经典算法学习算法设计
经典算法能给学习者以启示、示范作用。分析:可以将【算法2】用于对线性表(顺序存储)排序算法中。在直接插入排序算法中,其算法思想是从第2个数据元素开始直到第n个数据元素,逐一插入到已有序的子线性表中。【算法3】
PROCEDURESORT(V,n)
FORI=2TOnDO
{Y=V(I)
J=I-1
WHILE(J〉=1)AND(V(J)〉Y)DO{V(J+1)=V(J);J=J-1}V(J+1)=Y}
RETURN
分析:【算示3】其结构分为双重循环,外循环完成逐一取数据元素,即取第I个数据元素,内循环完成将第I个数据元素插入到前I-1个已有序的子线性表中。内循环完成的功能可以独立成为一个子函数(子过程),可以借用【算法2】。这正是结构化程序设计思想的体现,即主程序完成任务的划分,说明“做什么”,子函数(子过程)完成任务的具体实现,说明“如何做”。结构化程序设计方法采取“分解”的手段来控制系统的复杂性,将大系统划分为若干个相对独立的、功能单一的子模块。一方面子函数(子过程)可以实现软件的重用性,在不同的程序段有相同的处理过程时调用子函数(子过程),减少软件开发的工作量;另一方面子函数(子过程)对具体的实现技术细节进行隐藏,便于开发人员集中精力把握软件开发的核心和主要问题,降低了软件开发难度,从而保证软件质量。
四、结束语
对于计算机科学来说,算法的概念至关重要。通俗的讲,算法是指解决问题的一种方法或一个过程,在众多的算法中选择好少量的经典算法对于研究数据结构以及解决实际问题至关重要。掌握好经典算法的原理和规律,将对计算机程序设计开发起到事半功倍的作用。
参考文献: