数据结构与算法范文
时间:2023-03-15 08:17:28
导语:如何才能写好一篇数据结构与算法,这就需要搜集整理更多的资料和文献,欢迎阅读由公务员之家整理的十篇范文,供你借鉴。
篇1
1 理论教学
1.1 明确教学目标
《数据结构与算法》这门课程的所有算法思想最后都会落脚到程序上,都需要用高级语言表现出来,老师把握不好目标,很容易把数据结构当成C语言的“延伸”和“升华”,课堂上带领学生一个一个读算法程序,而没有做到让学生去领会算法的思想。所以老师一定要明确这门课的教学目标是编程思想而不是程序本身,先有好的构思和想法,辅助语言加以实现,每节课都要以“思想第一,实现第二” 为教学纲领,教学生怎么从实际问题中抽象出模型,提炼出思路,然后用程序来实现这个思路,最后真正的解决问题,就像古人讲的“胸有成竹”,在画竹之前,对于竹子的高度,树干、树枝和叶子的结构,心里要有个规划,做到心中有数,这样画出来的竹子才能形象。编程也一样,先从实际问题重剥离出系统架构,构造出合适的模型,选择高效率的算法,再使用高级语言把它实现,最后再进一步处理趋向完善,使之具备客户所需要的功能。学生要从《数据结构与算法》这门课程中掌握的就是如何从实际问题中抽象出模型、建造起架构的过程,老师只有时刻带领学生从这个角度来着手解决问题,才能真正为该课程的教学把握好方向。
1.2 合理运用教学方法
随着现代教学水平的提高,越来越多的多媒体课件和网络资源被运用于教学当中,人们也对启发式、问题探究式、课堂讨论式等这些新型的教学方法趋之若鹜,或多或少的把传统的教学方法冠以“落伍”和“填鸭式”等贬义色彩。但我个人认为,传统的黑板加粉笔的教学方法,在《数据结构与算法》这门课程当中仍然有着举足轻重的作用,因为PPT课件和动画都是老师预先按照自己的思路经过思考和摸索,多次尝试和修改而整理出来的,对于经验不丰富,未曾接触过相关知识的学生来说,直接跳出来的课件和动画没有给够他们思考和整理思路的时间,冰冷的课件和学生没有眼神、肢体语言等情感交流,无法从算法思想的角度去引领学生一步一步的剥离表象,抽离出问题的本质。所以,片面的强调新型的教学方法是不科学的,传统的黑板教学也不可忽视,在传统的基础之上,一些粉笔和语言都不太容易展示的算法执行过程,可以结合现代化多媒体教学手段来表现,形象的动画能让抽象的内容变得更加直观更易理解,学生也更容易被带入其中,从而使教学过程变得更加生动形象。
所以,合理的教学方法应该是以板书为主,课件为辅,配合老师与学生的情感交流,这样才能取得好的教学效果。
1.3 实例化教学设计
大学的学习和高中不一样,不再简单的以分数定乾坤,学生没有了压力也就没了动力,而且大学生都各有锋芒,有自己独立的思想,如何调动学生对该课程的兴趣,使被动学习变为主动求知就显得尤为重要,那如何激发学生的学习兴趣呢?答案是要让学生感觉到数据结构解决的问题其实都来源于我们的实际生活,是切切实实存在于我们周围的,比如讲到顺序表和链表,可以举例我们早期去银行办事需要排队,中间插队一个人后面的人都要后移(顺序表插入),中间有一个人离开后面的人都要前移(顺序表删除),这就是顺序表,而现在我们在银行取个号就可以找个舒服的位置坐下,或者离开去办其它的事情,等叫到号再到窗口,这就是链表,存储的位置不连续,但是大家的逻辑关系仍然存在;比如讲到图的最短路径问题时可以设计一个旅游场景,需要去多个城市旅游,但又希望旅途最短花费最少,让学生去设计路线;比如讲到约瑟夫环的时候可以结合犹太历史故事让学生身临其境;再比如讲到汉诺塔的时候可以让学生先试着玩一玩汉诺塔游戏,然后再考虑怎么用算法来实现。
“兴趣是最好的老师”,真正把学生的兴趣调动起来,使学生进入到一个积极思考和探索的活跃状态,教学就能起到事半功倍的效果。
2 实验教学
鉴于该课程的课时压缩,实验课的课时也随之减少了,学生能动手实践的时间减少使教学效果大打折扣。而该课程的学了老师在理论课上的引导以外,学生自己动手去“练”才是真正去领悟和内化算法思想的法宝,“练”必不可少,所以在这有限的实验课时间里,如何让学生的“练”落到实处也需要老师投入很大的精力来设计和管控。
2.1 合理安排实验项目
根据教学大纲,结合学生的实际掌握程度来设计实验项目,主要分为验证性、可选性和综合设计性三大类,验证性实验的目的是重温基础知识,强调编程规范性和完整的算法思想, 主要针对一些常用的算法实现, 如顺序表、链表的创建、要求学生在上机实验课堂内完成。可选性实验稍有难度,需要融会贯通和创新能力,针对基础较好的学生,如果验证性实验很快完成,就可以进行可选性实验项目的操作。综合设计类实验一般涉及多个知识点, 要求学生自己抽象出模型进行设计, 主要训练学生综合运用所学知识的能力、团队协作能力和自主创新能力。题目一般是要求解决实际生活中遇到的问题,可以对学生按照基础的强弱搭配成3-4人一个小组,完成后通过现场演示和答辩来评价效果,这类实验完成后学生在体会到成功喜悦的同时,也能领悟到数据结构及算法的价值,激发他们的求知欲望和探索精神,使其更加积极主动的学习,而这一部分人的主动也能带动其他的同学跟进步伐,形成一个好的学习氛围。
2.2 正确管理实验过程
实验课堂上,针对不同类型的实验项目,采用相应的教学方式。对于验证性实验,老师可以在实验开始前对实验的流程、操作要点及最终的运行效果进行讲解,不至于让学生盲目摸索,浪费时间。选择性实验需要针对部分基础较好的学生进行适当的启发式引导,对关键算法和思路予以提点。对综合设计性实验,教师可以采用项目式的教学方法,带领学生理清需求、提取模型、设计步骤、确定计划,并对小组成员予以分工,使得实验能够顺利的进行下去。
实验过程中也要设定一定的奖励机制,不能只看最后结果,对于积极主动,喜欢钻研的学生要及时奖励,给予一定的加分,在综合设计类实验中担任重要角色的学生也要识别出来,适当提高实验过程分数。
基础较差的学生光靠课堂上的练习远远不够,需要整合机房资源,给学生提供课外实践的机会,鼓励他们利用业余时间补齐差距。
篇2
关键词:数据结构预算法;国际化;互动式教学
文章编号:1672-5913(2013)18-0058-04
中图分类号:G642
0 引言
通过观察和对比,国际一流大学学生参与课堂发言和课后研讨的积极性要远远高于复旦大学学生,而参与研讨对于促进学生深入理解课程内容,培养学生在立题、思辨和协作方面的能力十分有益。为此,复旦大学软件学院开展了数据结构与算法设计类课程国际化建设工作,主要目标是研究如何在课堂教学中采用研讨型方式,在实验环节中采用协作型项目,并针对中国学生的特点,探索如何引导学生提出问题和参与讨论,以提高课程教学效果,缩小与国际一流大学差距的教学方法。课程建设教师团队的主要人员首先通过全程旁听美国麻省理工学院数门相同或类似的课程,认识与国际一流大学在教学手段和效果方面差距的同时,分析中美学生在提出问题、参与讨论方面表现差异的原因。然后通过与学生座谈方式收集整理中国学生不愿意在课堂上发言和参与研讨的主要原因和相应对策。最后介绍复旦大学软件学院根据课程国际化教学课题的研究成果进行教学方式调整和开展课堂教学实践的情况。
1 麻省理工学院在课程教学中促进学生参与研讨的先进经验
在开展数据结构与算法设计课程国际化建设过程中,课程建设教师团队的主要人员利用在美国麻省理工学院(MIT)参与研究工作的机会,在一年内全程旁听了Design and Analysis ofAlgorithms、Web 3.0、Economics 0f Information、Software Construction 4门课程,并且参加了MIT的IFF(International Faculty Fellow)国际大学教师培训项目。IFF是由MIT发起组织的、致力于提高国外高等院校教师的科研能力、培养研究生水平和授课技能的项目。在上述过程中,教师团队人员对于MIT在促进学生参与课程相关内容研讨方面的举措印象深刻,并将值得借鉴的教学方式和方法进行了归纳。
(1)学生参与课程相关内容的讨论需要相关知识的准备,只有将相关知识积累到一定的程度,学生才会自然而然地愿意对相关问题进行讨论,而课程教材和课堂讲义对知识积累是远远不够的。MIT在课程开始时就由任课教师提供课程相关的文献阅读列表,阅读完这些文献所需要的时间大约为课程授课时间的3倍左右。对比复旦大学类似课程的文献阅读要求,发现中国学生在完成课程相关文献阅读量方面远远少于国际一流大学的学生。
(2)每一门课程除了提供网站用于下载课程相关的资料外,还有课程的BLOG便于学生和教师在线交流。利用这样的系统,教师往往规定在课程授课期间,学生至少针对数个课题(完成相关文献的阅读后)在BLOG上发表自己的观点。由此促进学生围绕相关课题开展讨论,这样的方式也为那些不太愿意在众人面前发言的学生提供阐述自己观点的机会。
(3)MIT的教室一般都是阶梯教室,这样既可以让每一位学生能够清楚地看到任课教师各种面部和身体语言,也使授课教师能够看到所有的学生,时刻了解学生对课堂内容的各种反馈。学生座位之间留有通道,授课时教师会在整个教室里走动,确保能够走近每一位学生的身旁,让每一位学生感受关注和重视,这样也让学生感到亲切随和。实践表明,这样做更能让学生畅所欲言。
(4)教学内容融合任课教师的研究成果。任课教师对于自身的研究内容一般都有较深的认识和理解(甚至有些理论和技术是世界首创),讲解过程中能够广征博引,相关难点都能够娓娓道来,所以往往更为生动有趣,可以激发学生的提问热情和学习兴趣。教师只有在相关领域内具备一定的科研水平才能更好地讲授相应的课程内容。
(5)在讲解有关技术内容时,会邀请业界一些著名人物走进课堂为学生讲解其擅长的话题。以MIT互联网方面的课程为例,任课教师会请IBM、Google、Microsoft等著名科技公司副总裁或技术总监级别的人物为学生讲一堂课(有时是远程视频连线,教室配有大屏幕高清投影和高速网络),之后一般设有学生提问环节。这样的课程很受学生欢迎,学生提问也非常踊跃。
综上所述,在课程开始前精心为学生挑选各章节相关的阅读文献(分为必读和选读部分)、建设课程BLOG促进师生间交流、将研究内容融入课程内容等教学方式和方法都值得借鉴,并且通过一段时间的准备加以实施。但是中国学生不愿意上课发言和参与研讨也有其成长环境中文化背景的影响,例如,追求标准答案的应试教育、谨守中庸之道处事态度等。而美国学生从小就让他们不断地进行发言和表达的训练,从幼儿园开始,每天都会让小孩子轮流讲一下昨天发生的事情。参加各种活动和社团也是如此,久而久之,养成了愿意并且善于表达自己观点的习惯。所以对于我们的学生,不仅要营造让其发言的环境和气氛,也需要有意识地利用各种机会培养他们发言的习惯。
2 学生不愿意在课堂上发言和参与研讨的主要原因及改进建议
课题组对两个班52名学生针对不愿意在课堂上发言和参与研讨的问题进行面谈,每位学生面谈时间为20~30分钟。学生不愿意在课堂上发言和参与讨论的主要原因可归纳为:害怕回答错误后造成对自己不利的影响(特别是教师随后会给出答案的情况)、没有养成积极发表自己观点的习惯(与成长的文化和环境有关)、担心积极发言后被别人说爱表现、课堂上没有能够很好地营造出各抒己见氛围。调查过程中同时也听取了学生对让他们能够积极主动发言的一些建议和意见,归纳为以下几点。
(1)讨论的问题应该是一些不存在对错的开放性问题。
(2)可以先由教师开题和启发,然后找到学生感兴趣的几点展开讨论。
(3)教师要营造随和的课堂气氛,需要有一个破冰的过程,让学生放松不害怕。
(4)可以采取分组讨论然后再由学生总结发言的方式。
(5)提出一些学生比较熟悉且有启发的问题比较容易让学生展开交流。
(6)发言和讨论适当增加一些平时成绩(但也有学生担心别人认为他为了成绩而发言,所以增加成绩的比重也不宜过高)。
(7)不要仅对一个学生提问,要求其他学生可以随时补充。
(8)对于有标准答案的问题,可以采取按座位顺序点名提问回答的方式。
综合以上学生的意见和建议,为了让学生积极参与课堂发言和研讨应当尽量营造轻松随意的课堂气氛,提出的问题也应是开放性的(即没有标准的答案),任课教师要善于引导和组织课堂讨论,在提出问题前给予必要的讲解和启发。
3 教学方式调整和课堂教学实践
通过借鉴国际一流大学和国内名师的先进教学经验,针对中国学生,特别就数据结构与算法设计课程的教学方式提出了一些方案和措施,并且进行了相应的课堂教学实践。虽然这些方案和措施还有待进一步完善和改进,但是课堂教学效果和学生参与研讨和发言的意愿明显提高。具体的方案和措施包括以下几个方面。
3.1 尝试诱导式、研讨式和互动式教学方式
任课教师要改进之前以灌输式知识传授的教学方式,尝试采用诱导式、研讨式和互动式教学方式。教学过程中一般首先给出实际的应用问题,然后要求学生尝试提出解决问题的算法,其他学生需对提出的方法进行评价,提出不足之处和改进方法,然后通过讨论这个算法的缺点,引出克服这个缺点的其他算法,最后对解决相同问题的不同算法进行比较和归纳。适当增加学生对相关重要文献的阅读量,并且根据阅读和调研结果进行课堂讨论。以NP完全性问题教学为例,由于学生还没有学习计算理论方面的课程,对于理解NP问题和NP完全性问题有一定的困难。首先任课教师介绍旅行商问题,接着让学生尝试寻找有效地求解算法,在教师引导下讨论得出结论:在现有计算机体系结构和运算能力的基础上,一定规模的旅行商问题目前不存在找到最优解的计算复杂性为多项式的算法;然后指出存在一类这样的问题,并且任取这类中的一个问题,再任取这类中的另一个问题,则一定存在多项式时间复杂性的算法,即可以把前者转变为后者。如果存在解决前者的多项式算法,必定存在能够解决后者的多项式算法;最后指出目前仍然没有找到多项式算法来解决这类问题,同时也不能证明这样的多项式算法不存在。为了让学生加深对上述问题的体会并且熟知典型的NP问题,将学生分成9组,每一组给出一对问题,其中一个属于P(多项式)问题,一个属于NP问题。要求学生调查这一对问题在应用中出现的实例和变体,然后设计可行的解决方法。并且要求每组以课堂演讲的方式向师生介绍他们的调查结果,听取报告的教师和学生可以随时进行提问,要求做报告的学生回答。教学实践表明,此举加深了学生对NP完全性问题的认识和理解。
3.2 从解决实际问题出发,培养学生提问和思辨的能力
对于每个知识单元,首先提出若干个实际应用中的问题,在提出可行的数据结构与算法前,引导学生进行讨论,并且提出自己的解决方案。通过分析学生所提出的各种方法,比较之前已学方法,归纳出新的数据结构与算法的特点和用途,最后在深入剖析和讨论的基础上进行扩展和综合。
3.3 借鉴国际一流大学的教学内容和方式,弥补与国际先进授课水平之间的差距
数据结构与算法设计课程的教学内容和方式借鉴了美国麻省理工学院的同名课程,并尝试进行诱导式、研讨式和互动式教学。课程的教材、讲义、作业、实践和考试全部使用英文,外教采用英语授课。将世界顶尖级学者撰写的经典著作Introduction to Algorithms作为课程的教材,并且根据中国学生的生活经历和背景文化,对部分案例进行相应的增补和改写。
3.4 以应用为导向,培养综合型人才
目前计算机学科方面的教学,一般从计算机基础知识和编程原理开始,经过若干中级课程,直至大学三、四年级,学生才可能涉足整个软件系统开发的全过程,这样往往造成“只见树木,不见森林”的情况。学生已经学习了构成软件系统所需的知识和技术,但是难以针对某一现实应用,将所学较好地综合起来。在大学低年级时,以完整系统开发和应用为目标,让学生在专业学习的早期就能够了解和体会实际应用的复杂性,掌握并实践综合集成各项技术的方法和手段。学生只有较早地了解整个软件系统的开发与应用,才能在今后创造性地综合运用所学,成为既有较高专业水平,又对现实应用有敏锐洞察能力的复合型人才。
3.5 以科研带动和促进教学,将最新技术的发展成果融入教学内容中
数据结构与算法的基本内容虽然相对稳定,但对已有数据结构与算法的扩展和结合,特别是解决新的应用方面的发展却日新月异,知识更新和演化速度较快。数据结构与算法设计课程组的教师在现有教材的理论体系和教学内容的基础上,及时了解和把握技术发展的新动向,将最新的理论创新和技术进步充实到教学内容中,每年都增补紧跟学科发展的新内容。此外,任课教师会指导学生参与自己的科研项目,或者推荐学生进入其他教师的实验室从事相关的科研活动。
这些方案和措施的实施,使得数据结构与算法设计课程能够在较短的时期内形成科研和教学并线、讲解和演示并重、理论和实践并行的特色。课题组教师不断用科学研究和国际学术交流的成果充实课程的内容,使课程能够充分体现目前算法理论和应用方面最新的发展和动向。在教学中始终坚持理论与实践相结合的原则,从经典案例引出科学问题,并强调对学生逻辑思维和动手能力的培养。
4 结语
篇3
【关键词】考核方式改革 人才培养 动手能力
《数据结构与算法》是计算机和信息与计算科学专业一门重要的专业基础课,在信息专业教学体系中占有举足轻重的地位。为进一步培养学生的实际应用能力和独立解决问题的意识,使同学们能够把所学知识与实践有机的结合,对《数据结构与算法》课程的考核方式进行改革。
一、当前考核方式存在的问题和改革的必要性
期末笔试的成绩比重很大,忽略了学生的学习过程。期末的成绩占到80%,期末决定了学生是否及格。有一部分学生平时不学习,临近考试采用突击学习的方式,考试虽然及格了,可是考试后没多长时间基本都忘了。为了平时成绩得高分,同学之间抄袭作业的情况很常见,破环了学生的学习氛围和学习的积极性,不利于学生建立良好的学习氛围。为了适应应用型人才培养模式的改革,提高学生的实践动手能力,结合目前考核体系对于本课程存在的问题,应该对现行考核方案进行适当的调整和改革。调整的原则是结合本专业学生的特点和专业课程体系,理论联系实际,着重培养理论联系实际能解决实际问题的应用型人才。改革的目的是要正确评价学生的综合素质,提高学生就业竞争能力。
二、考试改革的方法
重视学习过程,增加期中考试。采用过程化考核思想,避免学生突击学习,增加期中考试。用8周左右的时间学习完数组之后进行一次期中考试。目的是考查学生的基础知识和程序设计语言。期中成绩占总成绩的30%。降低期末考试成绩的权重。避免期末考试成绩“一锤定音”。数据结构中的树和图连同查找和排序内容是期末考试的重点。为了避免遗忘线性结构的内容,期末考试也要涉及期中的相应知识点。期末成绩占总成绩的40%。
为了培养学生动手能力,增加上机实践考核。上机实践采用阶段式的考核方式。为了避免学生的抄袭,培养自我学习的能力,上机考核的内容不做统一规定。学生至少完成两个题目,一个是线性结构插入h除等操作;另一个是非线性结构和排序中选出一个题目。两个题目分别在期中和期末考试之前考核完毕,考核的重点是看学生对程序的理解、上机熟练操作的程度以及答辩情况。为了鼓励学生的学习兴趣和对后续课程的延伸,对于在实践操作中表现出色,勇于创新的学生给予加分的奖励。实践题目完成情况占总成绩的23%,奖励加分占2%。
降低平时成绩。现行的考核体系中平时成绩所占的比重偏高。平时成绩的主要来源应该是学生理论课的课堂表现,包括出勤。从课堂的表现可以看出学生对问题的理解和思考,出勤可以看出学生的学习态度。平时成绩占总成绩的5%。
三、考核的结果分析
考核结果的分析主要从横向和纵向两个方面进行对比。横向是指不同年级的同一门课程(10级和11级对比);纵向是指同年级学生的两门课程(11级的计算机方向专业课程只开设了《面向对象程序设计》和《数据结构与算法》)。横向对比的结果表明同一门课程不同年级学生的掌握情况,纵向对比的结果显示出来的是学生的基础和对后续课程的影响。
本次考核的主要对象是信息与计算科学系11级学生共78人,《数据结构与算法》课程成绩分布如下:
单独的成绩很难说明问题,下面从横、纵两个方面结合具体的数据进行分析。《数据结构与算法》和《面向对象程序设计》课程11级和10级学生成绩分析如下表:
纵向对比:从信息11级《数据结与算法》和《面向对象程序设计》两门课程成绩分析可以看出11级学生对《面向对象程序设计》掌握情况不好,从及格率、优秀率、最高分以及最低分中都能体现出来,先行课的学习情况直接影响后续课程。
横向对比:从数据表中可以看出11级的成绩最高分和最低分要比10级好,两个年级及格率的差距很小。11级的不及格率是10级的1倍,平均分差了9分,得出的结论是11级学生的基础差很多。
通过两组数据的对比,不难看出,11级学生学习先行课《面向对象程序设计》的情况不好。11级《数据结构与算法》不及格率比10级低0.74%,平均分低0.71,但优秀率高3.43%,最低分和最高分的差距由80分缩小到62分。就11级学生《数据结构与算法》和先行课《面向对象程序设计》的成绩对比来说,最低分和最高分的差距由92分缩小到62分,及格率提高23.65%,平均分提高16.49分,优秀率提高3.95%。从成绩上可以看出11级的学生整体成绩有所提高。也就是说明本次的课程考核改革取得了相应的效果。
四、考核中存在的问题
篇4
关键词:数据结构与算法分析;课程体系;研究型大学;创新性教学
为落实教育部“高等学校教学质量与教学改革工程”,湖南大学肩负着为建设创新型国家而培养创新型拔尖人才的重大历史使命[1]。湖南大学计算机与通信学院为进一步贯彻以人为本、因材施教的办学理念,加速培养基础宽厚、学科知识交叉的复合型人才,充分调动学生学习积极性,以精品课程为目标,进行研究型大学创新性课程建设,实施设计与创新型人才培养模式的本科教学质量工程[2]。在学院制定的新本科教学计划中,“数据结构与算法分析”是四门学科通识教育课之一。课程教学团队结合学校和学院的教学质量工程要求,对课程进行了全面的创新建设。
1 “数据结构与算法分析”课程的地位
计算机专业的学生今后无论是从事硬件方向的工作,还是从事软件方向的工作,其程序设计和算法设计与分析的能力都是非常重要的!随着计算机应用领域的扩大和软硬件的发展,计算机加工处理的数据越来越庞大和复杂,而且对其处理的效率也提出了更高的需求[3]。“数据结构与算法分析”就是随着处理对象的复杂性不断增加而发展起来的一门课程,作为计算机专业的核心课程,它在专业人才培养链条中占有举足轻重的地位,它是一门承上启下的枢纽课程,同时也是一门实践性很强的专业技术基础课程[4]。
2研究创新性“数据结构与算法分析”课程的目标
研究型大学既要培养研究型人才,也必须培养高质量的应用型人才,即必须多目标培养人才[5]。同时为贯彻教育部本科教学质量工程提出的显著增强学生的实践能力和创新精神的要求。我们制定研究创新性“数据结构与算法分析”课程的目标是:激发创新意识,培养研究兴趣,训练两种能力,提高实践技能。
研究数据结构的目的是为了学会编写更高效的程序,基于追求更有效率程序的创新理念,引入并加强“权衡”的概念,培养学生研究数据结构相关的代价和效益的兴趣和方法。通过课程教学和实验,训练数据结构的设计和算法分析两种能力。这两种能力有以下三个层次:1)学会常用的数据结构,形成一个程序员的基本数据结构工具箱,在解决实际问题时,能熟练使用数据结构来表示和存储问题中待处理的数据元素。2)熟练地应用各种常用的数据结构。掌握对每一个数据结构和相关基本操作算法所花费的时间和空间代价的分析方法。针对实际问题所要求的资源限制,能确定工具箱中的哪一个数据结构对于该问题是最合适的,即解决方案是最有效率的。3)了解研究数据结构和算法分析的方法,培养研究数据结构的兴趣,为在解决实际问题中,能发明新的数据结构和进行正确的算法分析打下良好的基础。
通过该课程的学习,我们不仅要让学生掌握数据的逻辑结构、存储结构及其相应的算法,更重要的是激发学生的研究创新意识,培养学生研究问题和解决问题的能力,即能够把现实世界中的客观问题变换为在计算机内的表示形式,学会组织数据、选择算法、养成良好的程序设计风格。所以,“数据结构与算法分析”的教学要以培养学生的实践能力为核心,重点提高学生的分析设计能力和编程能力,进而提高学生的系统的认知、设计、开发、应用能力,为研究数据处理的科学问题和创新解决问题的科学方法打下坚实的基础。
3研究创新性“数据结构与算法分析”课程建设
3.1教学计划
在创新与设计型人才培养模式探索过程中,学院基于基础厚实、学以致用、知识技能并重的理念,大胆重设课程体系,实现通识教育基础上的宽口径专业教育的两阶段培养模式,并将实验教学组成相对独立体系,提出了“课程实验――实验课程――工程设计训练――毕业设计”四级实验体系[2]。学院选出“数据结构与算法分析”等四门专业基础课程作为专业学科通识教育平台课程。要求课程相对稳定,安排足够学时,力求讲透讲深,夯实专业学科的理论基础。安排足够的课程实验学时,通过课程实验使学生巩固加深对理论知识的理解;以及通过相应的实验课程,训练和增强学生综合运用知识的能力。图1 给出了本科教学计划的部分运行图。由图可知,“数据结构与算法分析”在课程体系中的安排,凸显了其作为培养学生专业基本能力的地位和作用,强调计算思维能力、算法设计与分析能力和程序设计与实现能力的训练和培养,为全面培养学生的创新与设计能力打下坚实基础。
3.2教学大纲
课程教学大纲根据近年全国硕士研究生入学统一考试计算机科学与技术学科综合考试大纲中的要求,参考全国著名高等院校近几年使用的教材以及期末考试、研究生入学考试试题编制而成。教学内容包括54个知识点,分为:数据结构绪论,算法分析,线性表,栈、队列和数组,树和二叉树,图,查找和内部排序八个部分。每个知识点根据课程目标中三个能力层次要求分为基础知识,重点知识,提高知识,并为其设计相应的教学内容,教学进度,作业题或实验题以及考查评价要求。
如教学大纲中线性表部分。通过这部分的课堂和实验教学,要求学生熟练掌握线性表的基本性质,及其顺序存储结构和链式存储结构的描述方法,以及线性表的各种基本操作的实现,这是该部分的基础知识,注重课程目标中能力层次一的培养。理解线性表的两类存储结构的特点,能够从时间和空间复杂度的角度综合比较两类存储结构和各种基本操作性能的不同特点及其适用场合,这是该部分的重点知识,注重课程目标中能力层次二的培养。了解从实际应用问题的需求分析中发现待处理数据具有线性关系的方法,以及如何设计合适的基本操作,这是该部分的提高知识,注重课程目标中能力层次三的培养。重点考查学生对线性表的基本概念和基本应用的掌握,以及对线性表两种存储结构实现(尤其是链表实现)的特点的理解情况。通过实验和算法设计题考查学生对线性表灵活运用的程度。
3.3教材建设
由于计算机科学是一门快速发展的新兴科学,数据结构与算法分析的理论、概念和方法随着程序设计方法学和程序设计语言的发展不断发展和更新。这些情况给课程的教材建设提出了更高的要求:必须紧跟计算机科学技术发展的步伐[6]。在选材上,我们始终坚持统一要求和因材施教的原则,确保教材内容的组织科学、合理,体系得当。选取的课堂教学教材,内容涵盖了教学大纲中确定的所有知识点,并根据课程的培养目标,以及学生的学习基础和兴趣需求,选用了三本高水平教材――严蔚编的《数据结构(C语言版)》、Clifford A. Shaffer主编的《数据结构与算法分析(C++版)》和Sartaj Sahni主编的《数据结构、算法与应用(C++语言描述)》。经过几年的教学实践,学生普遍反映严老师的书在讲解知识点时,能够把抽象的内容表述得更明确、更具体、更便于学生理解和把握。两位美国教授编写的教材都使用C++语言描述数据结构和算法,使得数据结构与面向对象的思想紧密结合。Shaffer的书还结合算法分析来讨论各种存储方法和算法的利弊,如何设计出有效率的算法,如何根据应用需求选择最佳方案,这种“授人以渔”的思想极大激发学生的思考热情。Sartaj Sahni的书最大特色就是强调应用,通过现实生活中的许多应用实例具体演示了各种数据结构和算法设计方法,使学生能了解学习数据结构后如何应用到实际工作中去,学以致用。
只靠读书是不能学会灵活使用数据结构的。课程的教学目的不仅是让学生掌握各种数据结构,更重要的是培养学生解决实际问题的能力。因此,上机实验是课程教学的重要环节。为了帮助学生进行有效的实验训练,我们积累多年实验教学改革经验,编写了《数据结构与算法分析课程实践》讲义,用于指导学生的课程实验教学。在讲义中不仅精心设计题目,紧扣理论内容,由浅入深,循序渐进地培养学生计算思维能力、算法设计与实现能力,而且给出了实习步骤和实习报告的规范,训练学生软件工程的能力。教学实践表明,学生通过上机训练和完成实验报告,不仅加深了对理论知识的理解,提高了复杂程序设计的技能,而且培养了良好程序设计的习惯和工作作风。
数据结构与算法分析是实践性很强的课程,仅靠上课和上机中学习是绝对不够的。为了给学生在课外自学和练习中提供指导,我们编写了《ACM程序设计培训教程》,并提供在线评测系统供学生随时测试。这样做可以充分调动学生的学习积极性和主动性,并使其钻研更深、更新、更难的问题,提高研究创新能力。
3.4教学组织
多年来,本课程教学团队已积累了一套“课堂―课程实验―实验课程―课外自学辅导”四个环节相互配合,提倡激发兴趣,精讲多练,重点突出,培养专业基本能力和研究创新的教学实施方案。
课堂环节注重计算思维能力的训练。在讲授具体课程内容时,要精讲,把重点要讲透彻,把难点加以分解,让学生能理解。要串讲:把前后相互关联的多个知识点串讲,总结其中的共性,突出各自的特点,分析相互的差别。要活讲,除了讲解基本的知识,更要授人以渔,要把“分析问题中待处理的数据建立抽象数据类型、根据物理存储特点建立物理数据结构、设计有效率的存储结构和基本操作算法、分析各种数据结构和基本操作算法特点和适用性”这样一条学习主线给予详细的介绍,引导学生有效地学习理论知识,进行计算思维能力的训练,使学生掌握创新地学习的能力,以激发学生对问题的探索精神。
实验注重算法、程序设计与分析能力的训练。通过实验报告文档,训练学生的算法设计和分析能力,通过上机实践,训练学生的程序设计和调试能力。实验实践环节由简单到复杂,通过精心挑选的验证型、技能型、创新与设计型三类实验题目,提升学生对理论知识的理解和应用能力,促进学生的创新研究思维。对每次实验的目的、原理、实验步骤、注意事项和实验要求都做出了详细的说明,突出了实验的重点,并编写了详细的实习指导书,包括实习报告范例、难度不同的程序范例,便于学生从模板开始,快速入门与提高。实验报告包括需求分析,概要设计,详细设计,调试分析,测试结果,使用说明和实验心得七个方面。严格实施这些貌似繁琐的规范,对于学生基本程序设计素养的培养和研究问题方法的训练,将能起到显著的促进作用。
课外自学辅导注重因材施教,满足不同的学习需求。学生的兴趣、专长,接受能力、自学能力都有差异,课堂上“均等和有限”的教学不能达到因材施教的目的。在课堂上,教师只能针对程度一般的多数学生的情况进行教学,对于程度差的学生要靠个别的辅导,帮助其积累知识和提高理解能力,跟上一般学生的进度。对于优等生,也要进行个别的指导,指定课外读物,加大信息量,布置思考题,调动其潜能,引导其创新。对于尖子生,我们还有一条措施,让其参加程序设计竞赛,组织和指导他们参加全国性的学科竞赛,促使他们脱颖而出。
3.5教学研究
为实现培养“宽口径、厚基础、强能力、高素质”的研究型人才的教学理念,学院对包括数据结构与算法分析在内的四门学科通识教育课程进行重点建设,组织专业教师认真总结多年来的教学经验,深入开展教学研究,提出一系列合理的教改方案。
1) 优化调整专业培养计划。
2009年初,为配合学校的人才培养模式向研究型转变的本科教育培养计划改革,学院制定了新的旨在培养设计与创新型人才的课程体系和实验体系,把“数据结构与算法分析”课程定位在学科通识教育课程,全院所有专业的学生必修。同时把该课程从第四学期提前到第三学期,并与第一学期开设的程序设计基础,第二学期开设的高等程序设计和软件基础实验1,以及第四学期的软件基础实验2,构成一组课程体系,保证本科生在通识教育培养的两年中,每个学期都开设程序设计方面的课程,为培养设计与创新型人才夯实学科基础。
2) 基于课程责任制的师资队伍建设。
近几年,学院在教学改革中大力实施定岗定编和课程责任制改革。根据教师的科研方向分配教学任务,同时按照课程特色组合多个教学团队,并与教师所属的科研团队互相关联,达到科研与教学相结合促进教学质量提高的目的。
3) 以申报精品课程为契机加速课程信息化建设。
以课程建设促进专业建设,打造精品课程是学院对每门专业核心课程的要求。根据精品课程建设的要求,开发了课程网站,学生可以随时访问网站获取课程资源、在线播放课件、习题指导等;开发实验与实践在线评测系统,学生可随时上网提交软件在线评测,并在学习园地学习交流。开发ACM竞赛培训网站,为喜爱编程的学生提供交流和切磋的平台。
4) 培养设计与创新人才的实践教学体系建设。
学院提出了“课程实验―实验课程―工程设计训练―毕业设计”的新型特色实践教学体系。明确“课程实验”和“实验课程”的内涵与目标,要求所有核心课程必有此环节[2]。“数据结构与算法分析”作为训练学生计算思维、算法设计和分析能力和程序设计与实现能力的重要课程,对课程实验和实验课程的实践教学环节不断改革创新,如教学团队积累多年实践教学经验,编写了《数据结构与算法分析课程实践》讲义,用于指导学生的课程实践教学。申请多个SIT项目,为学生提供研究创新平台。编写了《ACM程序设计培训教程》教材,对喜欢算法和程序设计的学生进行指导,使学生在各类与程序设计相关的学科竞赛中频获佳绩。
4结语
“数据结构与算法分析”是计算机专业的一门核心课程,学习数据结构和算法设计分析不仅为学习后续课程建立基础,也有益于创新与设计型人才的培养。
为了不使教学过程过于抽象和枯燥,我们要充分调动学生主动学习的积极性,提高教学的趣味性;大力提高学生的实践能力和知识应用能力,注重创新研究能力的培养。借着学院新型课程体系和新型特色实践教学体系改革的春风,我们明确了培养创新与设计人才的理念,针对数据结构与算法分析课程能力培养三层目标,在继承原有教学体系中关注课堂教学的基础上,加强实践教学环节和课外辅导提高环节,使这门课程的教学更加系统和全面。实践证明,这种新模式对提升教学质量非常必要,近几年,学生和校督导团的评教成绩在学院名列前茅,该课程已通过省精品课程评审,用新模式培养出来的学生陆续在全国各种大赛上获得较好名次,在2010年ACM亚洲区比赛中我院学生获得两个金奖。
按照学院提出的“创新与设计型人才”培养目标。“数据结构与算法分析”课程教学工作从课堂教学和实践教学两个方面进行建设和完善,精品课程网站和实验与实践在线评测系统已经投入使用,课程教学辅助课件在逐步建设中,符合创新与设计型人才培养目标的教材正在编写中,相信“数据结构与算法分析”这门课的教学质量在教学改革中将不断得到提高。
参考文献:
[1] 钟秉林,董奇,葛岳静,等. 创新型人才培养体系的构建与实践[J]. 中国大学教育,2009(11):22-24.
[2] 赵欢,骆嘉伟,李仁发,等. 计算机专业设计与创新型人才培养模式及课程体系研究[R]. 武汉:第八届全国计算机系主任论坛,2005,10.
[3] Gregory Goth. Turning Data Into Knowledge [J]. Communications on the ACM,2010,53(11):13-15.
[4] 教育部高等学校计算机科学与技术教学指导委员会. 高等学校计算机科学与技术专业人才专业能力构成与培养[M]. 北京:机械工业出版社,2010.
[5] 张思东,张有根,高万英,等. 重点大学既要培养研究型人才也必须培养高质量的应用型人才[R]. 深圳:全国电子高等教育学术研讨会,2003,11.
[6] 张乃孝. 编写“数据结构”教材的几点体会[R]. 南京:第二届大学计算机课程报告论坛,2006,7.
Constructing Innovative Curriculum of Data Structures and Algorithm Analysis
in Research-oriented University
LI Xiaohong, LUO Jiawei, YAN Hua, WU Hao
(School of Computer and Communication, Hunan University, Changsha 410082, China)
篇5
杨佩理
江苏沙洲工学院
摘要:本文针对在采用虚拟现实技术描述地理地形时所要求的数据海量、处理复杂的特点,采用金字塔分层结构,提出了细节层次算法的解决方案。探讨了适应于虚拟现实地理数据可视化的数据库模型结构。
关键词:虚拟现实;金字塔结构;细节层次算法
篇6
关键词:数据结构,前导课;算法
《数据结构》不仅是程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统等系统程序和其它大型应用程序的重要课程之一。为学生今后从事理论研究、应用开发、技术管理工作提供了坚实的理论基础,是专升本、考研和等级水平考试的必考科目,也是学生学习中感到比较吃力的一门课。
《数据结构》课程教学目标要求学生学会分析数据对象特征,掌握数据组织方法和计算机的表示方法,以便为应用所涉及数据选择适当的逻辑结构、存储结构及相应算法,初步掌握算法时间空间分析的技巧,培养良好的程序设计技能。本文对如何学习、掌握《数据结构》课程内容进行了探讨,提出了切实可行的有效学习方法。
一、注意前导课知识的熟练掌握
《数据结构》的前导课包括一门计算机语言(PASCAL、C或C++,本文以C++为例)和高等数学。要想轻松学习《数据结构》,必须先打好这两门课的基础。学生学习感到吃力主要是这两门课掌握不牢,用起来生疏,算法思路有,但却无从下手,不能熟练地用C++语句描述出来。所以,从c++语言入手,加强程序设计基本素质的培养,是学好数据结构的重中之重。
C++知识点主要有:(1)包含文件语句:#include。例如,#include、#include、#include、#include是常用的系统头文件。(2)函数和函数参数。在C++语言中,程序由一个名为main的主函数和若干个功能相对独立的函数模块组成。函数的调用是关键,要区分形参中值参和引用参数的使用。基本函数有:max(表达式1,…,表达式n)、min(表达式1,…,表达式n)、abs(表达式)、exit(表达式)。(3)运算符重载。在数据结构中经常要用的是在自定义的结构类型上对关系运算符进行重载,使得记录同记录之间、记录同其中一个域类型的数据之间也能进行比较。(4)类。当开发者的应用程序需定义自己的数据类型时,要使用C++中的类。(5)抽象类型和模板。用于实现软件的复用,提高利用率。(6)基本语句有:赋值语句、选择语句、循环语句、结束语句、输入/出语句、注释语句等,一定要彻底理解、熟练掌握这些语句。通过C++的学习,应该建立起良好的程序设计思想。
计算机解决实际应用问题及算法分析,涉及到很多数学知识。例如:集合、阶乘函数、排列、组合、对数、级数求和、递归,反证法、数学归纳法等数学证明方法,要对这些基本知识加以熟悉。
二、数据结构课程体系的归纳
数据结构讨论的范畴:数据成员以及它们相互之间的逻辑关系,也称为数据的逻辑结构,简称为数据结构;数据成员极其关系在计算机存储器内的存储表示,也称为数据的物理结构,简称为存储结构;施加于该数据结构上的操作,ADT抽象数据类型描述。
教材的主体可以总结为:基本概念、三类数据结构,两种存储结构、两种算法。三类数据结构有:线性(线性表、栈和队列、串、数组和广义表)、树(树和二叉树)、图等。两种存储结构有:顺序结构和链接结构。两种算法为:查找、排序。抽象数据类型(Abstract Data Type,缩写为ADT)是整个教材的核心。
抽象数据类型(Abstract Data Type,缩写为ADT)包括数据结构的定义、表示、操作实现三部分。定义如下:
ADT
Data:
Operation:
end()
数据结构常见的操作有:插入、删除、检索、遍历、排序等。每一种数据结构可有多种不同的存储方法。在不同的存储结构下,同一操作有不同的时间、空间复杂度。例如:线性表既可以用一维数组顺序存储,也可用指针结构链式存储。向线性表中插入、删除一个数据元素,顺序存储下,需平均移动表中一半元素,而链式存储下,仅需修改指针而不需移动元素。所以,要根据实际应用问题的操作,选用合适的存储结构,以提高执行效率。
三、总结章节特点,指导数据结构的学习
针对每章不同特点,总结学习方法及重点。如对线性表、树、图三种数据结构均按照“逻辑结构定义、特点、ADT描述;线性存储结构及ADT实现、算法复杂度分析;链式存储结构及ADT实现、算法复杂度分析;典型应用案例分析”模式进行讲解,也就是说,只要按此主线掌握了数据结构的内容,就达到了学习目的。
对查找方法从概念、算法思想、查找过程、算法实现等方面去掌握,从查找速度、占用存储空间多少、算法本身复杂程度、平均查找长度ASL(Average Search Length)等方面去评价分析各种方法,总结各自的适用条件。
对排序方法从概念、算法思想、排序过程、算法实现等方面去掌握,从排序所花费的全部比较次数、移动记录次数、占内存辅助空间的大小等分析时空复杂度,最后要考虑算法的稳定性,总结各自的优缺点及适用范围。
四、算法的学习
算法设计技能是学好数据结构的关键,根据学生学习的认知特点,主要从以下几个方面进行强化训练:
1 吃透课本例子。每学完一次新课,让学生对课本例子先分析任务、再自己编写算法与课本对照,找出不足,然后改进。如此反复练习,不仅能够培养学生动脑思考的习惯,而且还会养成遇事三思、认真、周密的作风。
2 精选上机题目,要求调试通过。每章找出一个综合性的应用题目,如怎样设计旅游线路,使得费用最少或路程最短;课程计划的编排等,要求用C++语言编写可执行的源程序,上机调试。这样不仅能够锻炼学生解决实际问题的能力,更重要的是能够激发学生学习课程的兴趣,抽象变具体,理论变实践,对这门课有更深的认识。
3 阅读填空法。找一些经典算法,配上必要的说明,适当去掉语句或表达式,让学生通过阅读填补空白,训练学生的程序设计能力。
4 准备一个经验本,记下自己出错的解决方法及老师讲解的其他同学出现的常见错误,抽空常翻看,逐步积累经验,使以后避免。
5 强化和本课程密切相关的结构体、指针和函数等知识点的再学习及上机训练。
6 加强算法阅读训练,模拟执行过程。通过大量的阅读分析和模仿,吸取算法精华,提高编程能力。如对教材中的类C语言算法改写程序,上机通过,掌握基本技能,巩固课堂教学的内容,加深了对算法的理解。
7 掌握算法设计的步骤。①明确算法要解决的问题目标。②选择合适的数据结构,确定在所选的数据结构上必须有的操作,写出抽象的算法,然后存储结构。③分解每个操作的实现步骤,用c++语言对应地写出实现程序。
有些学生经过学习之后,虽然能看懂教材上的算法,但当自己动手设计算法解决实际问题时仍感到无从下手。解决这一问题除了掌握必要的方法之外,必须通过多练习多动手,培养自己的程序设计经验和素质来解决。因此,要求学生必须认真对待算法设计型的习题,通过多做这类习题来理解、消化和巩固所学的知识,提高分析问题、解决问题的能力以及编程能力。
篇7
【关键词】数据结构;算法;软件设计
1.经典算法的选择
选择经典算法的重要性,PASCAL语言的创始人、著名的计算机科学家N.沃思说得好“程序=数据结构+算法”,足以见得算法在程序设计中的重要地位。在合理的数据结构基础上,算法是对数据结构的操作(运算),是数据处理的核心。在《数据结构》中介绍的基本数据结构有线性表、堆栈、队列、数组、树、二叉树、图以及相应的算法。一个算法是建立在某种数据结构的基础上,一个算法不可能脱离数据结构而孤立存在。只有通过学习算法,才能真正掌握某种数据结构。可以说学习《数据结构》的过程基本上是学习各种算法的过程。在众多的算法中有简单的、有复杂的、有容易的、有难度大的,在有限的学时情况下,不可能也没有必要逐一讲解每一个算法。大多数的算法,要靠学生自己理解消化。在这种情况下,如何选择少量的经典算法进行分析讲解,显得尤其重要。一个经典算法往往能起到以一当十、以点带面的关键作用。通过经典算法的分析,一方面让学生加深对数据结构基本理论的理解另一方面让学生学习程序设计方法。
选择好经典算法后下一步就是要对其展开综合分析,下面以具体的算法为例进行讨论。
2.利用经典算法说明基本原理
2.1 经典算法应能体现某个数据结构的基本特征
我们知道线性表顺序存储时其优点是能够对每个数据元素随机访问,存储密度高,其缺点是插入、删除操作时需要移动大量的数据元素,操作效率低。“向有序(由小到大或由大到小)的线性表(顺序存储)插入一个新的数据元素”,这一经典算法集中反映了线性表顺序存储的这些特点。
分析:将一个值为X的数据元素插入到有序(由小到大或由大到小)的线性表(顺序存储)中,可以分两步进行,首先查找到值为X的数据元素在线性表中应有的位置,采用从头到尾循环比较的方法确定其位置I,然后,将第I个以后的全部数据元素向后移动一个存储单元,最后将值为X的数据元素存放到第I个位置上,线性表元素个数增1。
【算法1】
PROCEDURE INSERT(V,m,n,X)
//将值为X的数据元素插入到V数组中,(线性表顺序存贮在V中)m为最多元素个数,n为当前实际元素个数
IF (m=n) THEN{“OVERFLOW”; RETURN}
FOR I=1 TO n DO
IF (X〈V(I))THEN BREAK
FOR J=n TO I BY -1 DO V(J+1)=V(J)
V(I)=X
n=n+1
RETURN
分析:【算法1】的优点是简单,便于理解,缺点是:
①循环体内有提前退出语句,不利于结构化程序设计;
②确定新数据元素位置和移动数据元素分两步进行,有重复操作,可以改进之,将两步合并一步完成,即将循环比较与移动数据元素同时进行。从线性表的尾部开始向前循环比较,比新数据元素大者后移,直到小于等于时停止。
【算法2】
PROCEDURE INSERT(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】能进一步推广。
2.2 利用经典算法学习算法设计
经典算法能给学习者以启示、示范作用。
分析:可以将【算法2】用于对线性表(顺序存储)排序算法中。在直接插入排序算法中,其算法思想是从第2个数据元素开始直到第n个数据元素,逐一插入到已有序的子线性表中。
【算法3】
PROCEDURE SORT(V,n)
FOR I=2 TO n DO
{ 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】。这正是结构化程序设计思想的体现,即主程序完成任务的划分,说明“做什么”,子函数(子过程)完成任务的具体实现,说明“如何做”。结构化程序设计方法采取“分解”的手段来控制系统的复杂性,将大系统划分为若干个相对独立的、功能单一的子模块。一方面子函数(子过程)可以实现软件的重用性,在不同的程序段有相同的处理过程时调用子函数(子过程),减少软件开发的工作量;另一方面子函数(子过程)对具体的实现技术细节进行隐藏,便于开发人员集中精力把握软件开发的核心和主要问题,降低了软件开发难度,从而保证软件质量。在利用【算法2】时要稍加修改,见【算法4】。
【算法4】
PROCEDURE INSERT(V,I,X)
//将值为X的数据元素插入到已有序的前I-1个数据元素中
J=I-1
Y=X
WHILE (J〉=1) AND (V(J)〉X) DO {V(J+1)=V(J);J=J-1}
V(J+1)=Y
RETURN
相应的主程序也要作修改,见【算法5】
【算法5】
PROCEDURE SORT(V,n)
FOR I=2 TO n DO
INSERT(V,I,V(I))
RETURN
3.结束语
在众多的算法中选择好少量的经典算法对于教好、学好《数据结构》至关重要;经典算法要有助于学生理解对应的数据结构,经典算法的分析要侧重于程序设计能力的提高。
参考文献
[1]欧建圣.数据结构教学研究――经典算法的综合分析[J].武汉工程职业技术学院学报,2004,16(1):58-60.
篇8
关键词逻辑结构存储结构操作运算横向联系纵向联系
1引言
数据结构作为计算机核心学科,其主要研究内容:逻辑结构,物理存储结构,操作(或算法)[1]。通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
根据数据元素之间不同特性,把数据结构划分四种基本结构:(1)集合,(2)线型结构,(3)树型结构,(4)图状结构或网状结构。针对每种数据结构均从逻辑结构、存储结构和操作运算等方面进行研究,是贯穿数据结构研究始终的“红线”,也是数据结构研究的共同切入点,称之为数据结构的“横向联系”。从集合、线型结构等基本数据结构入手,以实现树形结构、图或网状结构等较复杂结构研究,实现数据元素间的关系从简单到复杂探讨,称之为“纵向联系”。
2逻辑结构、存储结构、操作运算的思想模式——数据结构间的横向联系
逻辑结构的定义、存储结构的实现、操作运算的实现是对数据结构研究的基本思想,一种数据结构的研究首先对这三方面内容有一个清晰的探讨。
集合数据结构与数学中集合概念是一致的,其逻辑结构元素间只是同属关系。存储结构实现只是在计算机内存储,它的操作就是一些交、差、并、补等。
线型结构是N个数据元素的有限序列,至于每一个数据元素的具体的含义在不同的情况下各不相同,其长度可根据需要增长或缩短,其逻辑结构就是它的数据元素间的线形关系,即一个对一个,一个元素最多有一个前驱,最多有一个后继。它的存储结构的实现一般有顺序存储和链式存储两种方法。顺序表是指用一组地址连续的存储单元依次存储线性结构中的数据元素,这是一种随机存取的存储结构;链式存储是数据元素之间的逻辑关系由结点中的指针来表示并且每一个结点有且只有一个指针域。线性结构的操作中,最基本的操作是在线性结构中插入、删除数据元素。存储结构为顺序存储有线性顺序表、数组、串等。存储结构为链式存储结构时有链表等。根据线性表的操作的不同便产生了两种重要的数据结构即栈和队列,这两种数据结构是线性结构的典型例子[2]。
树型结构是一种重要的非线性结构,其中的树和二叉树最为常用。直观看来,树是以分支关系定义的层次结构,其逻辑结构是一对多的关系,而在二叉树中是一个根结点对应左右两个孩子的层次关系。存储结构的实现当采取顺序存储时用一组地址连续的存储单元依上而下、自左向右存储树中的结点元素。在链式存储结构中可采用二叉链表表示法即链表中结点的两个链域分别指向该结点的第一个孩子和下一个兄弟结点,树形结构的最基本的操作是遍历,其它复杂的操作大部分就是遍历操作的衍生与扩展。在树型结构中最有特色的一种数据结构就是二叉树,其独特的逻辑结构是每个结点至多有二棵子树并且还有左右之分,这就决定着它独特的链式存储结构,每个数据元素有且只有两个指针分别指向该结点的左右孩子。二叉树的最基本的操作是遍历二叉树,对每个结点的访问是对其它复杂操作的基础,例如统计结点个数、统计叶子结点数、交换二叉树的左右孩子等一些复杂的操作运算均是遍历二叉树操作的扩展和衍生。基于二叉树的递归定义可得到遍历二叉树递归算法,前序遍历、中序遍历、后序遍历二叉树。
图状结构是一种较线型结构和树更复杂的数据结构,图的逻辑结构是多对多的关系即在图形结构中结点之间的关系是任意的。因此在存储结构中无法以数据元素在存储区中的物理位置来表示数据元素间的关系。即图没有顺序映象但可以借助数组的数据类型表示元素之间的关系,用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系信息[3]。另一方面图的存储结构也可由多重链表实现,即一个由一个数据域和多个指针域组成的结点来表示图中的一个顶点,其中数据域存储该顶点的信息,指针域存储指向邻接点的指针,但由于图中各个结点的度各不相同,结点的指针域设定不易确定,则图的链式存储结构可用邻接多重表表示法,对图中每个顶点建立一个单链表,第一个单链表的结点表示依附于顶点V的边,每个结点由三个域组成其中邻接点域指示顶点V的邻接点在图中的位置,链域指示下一条边或弧的结点,数据域存储和边或弧相关的信息,如权值等。每个链表附有一个表头结点。在表头结点中除了设有链域指向链表中第一个结点外还设有存储顶点的名或其它有关信息的数据域,这样实现了图的链式存储。遍历是最基本的操作也是最重要的操作运算,它是求解图的连通性、拓扑排序和求关键路径的基础,然而图的遍历比树的遍历复杂的多,因为图的任一顶点都有可能和其余的顶点相邻接。所以在访问某个顶点之后可能沿着某条路径搜索之后又回到该顶点上。因此要设有一个辅助数组V[0..n-1],它的初始值置为假,一旦访问顶点Vi,便置V[i]为真,这样避免了同一个顶点被访问多次,对图的遍历有深度优先搜索和广度优先搜索。图的深度优先搜索遍历类似树的先根遍历,是树的先根遍历的推广。广度优先搜索类似树的按层次遍历的过程。图状结构中复杂的操作大部分都是以图的遍历为基础。
因此无论对于线型结构、树性结构、网状或图,它们都遵循着逻辑结构的定义、存储结构的实现、操作运算方法的实现模式来实现每种数据结构的类型。在数据结构研究中对每种数据结构的研究只有对它的这三个方面内容的研究,才能对它进行探索、掌握、改进。这是数据结构研究中的基本思想。在数据结构研究中当前面向各专门领域特殊问题的多维数据结构和从抽象数据类型的观点来讨论数据结构,都不能背离这个思想。
3由栈和队列实现树、图的遍历——纵向联系
遍历操作对树、图结构是很基础、很重要的运算,它是实现一个数据结构的核心部分,虽然根据树、图的递归定义能设计出树、图的遍历的递归算法,但从线型结构到树、图的发展也是数据结构从简单到复杂的逐步发展过程。线型结构中栈和队列是两个非常重要的数据结构,对于树、图的遍历可用栈和队列来实现。对树、图复杂的数据结构,可通过栈和队列的操作来实现复杂数据结构的操作,体现了数据结构间的“纵向联系”。
用栈实现二叉树的前序遍历算法:
Statuspreorder(bitreet)
{P=t;
Initstack(s);
Push(s,p);
While(!stackempty(s)){
pop(s,p)
while(p){
visit(p);
push(s,prchild);
p=p-lchild;}
}}
用栈实现二叉树的中序遍历算法:
Statusinorder(bitreet)
{p=t;
Initstack(s);
Push(s,p);
P=Plchild;
while(!stackempty){
while(p){
push(s,p);
p=p-lchild;}
pop(s,p);
visist(p);
p=prchild;}}
用栈来实现二叉树的后序遍历算法:
Statuspostorder(bitreet){
P=t;
inistack(s);
While(p||!stackempty(s)){
If(p){
push(s,p);
P=plchild;}
ElseIf(!stackempty(s)){
pre=null;
Gettop(s,p);
While(prchild==pre){pop(s,p);
Visit(p);
Pre=p;
Gettop(s,p);}
P=prchild;}
}}}
用队列实现二叉树层次遍历算法:
VoidLayers(bitreet){
if(t){
p=t;
Initqueue(q);
Enqueue(q,t);
while(!empty(q)){
p=Dlqueue(q);
visit(p);
if(Plchild)Enqueue(q,plchild);
if(prchild)Enqueue(q,prchild);}
}
用队列实现图的广度优先搜索算法:
VoidBfs(Graphg,intv){
Visit(v);
Visited[v]=true;
Enqueue(q,v);
While(!emptyqueue(q)){
Dlqueue(g,vex);
For(w=firstadjvex(g,vex),w,w=nextadjvex(g,vex,w)){
If(!visited[w]){visit(w);
Visited[w]=true;
Enqueue(q,w);}}
}}
VoidDfs(Graphg,intv){
Visit(v);
Visited[v]=true;
Push(s,v);
While(!emptystack(s)){V=gettop(s);
For(w=fistadjvex(g,v);w&&!visited[w];w=nextadjvex(g,v,w))
If(!w)pop(s)
Else{visit(w);
Visited[w]=true;
Push(s,w);}}
因为二叉树、图的其它的操作大部分是对遍历基本操作的拓展或综合应用,灵活运用栈和队列可实现,并且算法描述比较直观。线性结构是数据结构学科的基础,树、图的发展在线性结构的基础上而发展,因树、图发展促进着线性结构中和一些算法的完善和改进,线型结构、树型结构、图状结构是紧密相联的。
4抽象数据类型的研究
数据结构间纵横联系明显且紧密。运用与把握这种“纵横联系”,对从抽象数据类型的角度来进行数据结构的学习与研究有着重要的借鉴意义。
抽象数据类型(ADT)的研究越来越被人所重视[4-8],它可理解为数据类型的进一步抽象。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。对于抽象数据类型的描述,除了必须描述它的数据结构外,还必须描述定义在它上面的运算(过程或函数)。抽象数据类型上定义的过程和函数以该抽象数据类型的数据所应具有的数据结构为基础。它仍遵循逻辑结构、存储结构、操作运算的数据结构基本思想,所有的抽象数据类型都可有简单的分类策略获得,这个策略就是抽象数据类型对象像什么和对它们做些什么。逻辑结构定义、存储结构表示、操作的实现在抽象类型中它们被称为数据类型说明、抽象数据类型的表示和抽象数据类型的实现[3]。抽象数据类型具体的表示和实现依赖所采用的语言,用户可以用某高级语言的固有数据类型和自定义类型并借助于过程和函数来表示和实现抽象数据类型。
5结论
逻辑结构、存储结构、操作运算等核心方面是贯穿数据结构研究与发展的一条基本线,也是数据结构研究中所看到数据结构间的“横向联系”。应用基本数据结来实现复杂数据结构的方法与途径,这是对数据元素之间关系从简单到复杂的探讨,即为“纵向联系”。数据结构联系是对数据结构的整体把握,体现在这种“横向联系”和“纵向联系”之中。灵活运用与把握这种数据结构间的关系,对抽象数据结构类型的研究有重要的借鉴意义,同时对数据结构的实际教学过程有着一定的指导意义。
参考文献
[1]陆松年.数据结构教程[M].北京:科学出版社.2002年
[2]严蔚敏.数据结构(C语言版)[M].北京:清华大学出版社.1997年
[3]帅训波.数据结构间普遍整体联系[D].曲阜:曲阜师范大学计算机科学学院.2003年
[4]蓝雯飞.数据结构的面向对象描述方法研究[J].计算机工程与应用,2006;42(26):79-80
[5]刘毅.关于Treap数据结构问题的研究[J].计算机应用与软件,2005;22(8):36-38
[6]胡泽明,岳瑞生,王志刚.嵌入式GIS线要素无缝拼接的数据结及实现算法[J].测绘科学,2006;31(5):102-103
篇9
关键词:数据结构;教学效果;存在问题;改革总结
一、课程的重要性
《数据结构》课程是计算机专业中一门重要的专业基础必修课,它为操作系统、数据库原理、编译原理、单片机原理等后续专业课程的学习奠定了基础。其次,数据结构课程是计算机相关专业的考研专业课之一。该课程的重要性显而易见。
二、教学中存在的问题
《数据结构》课程的教学目标是全面系统地介绍数据的逻辑结构、存储结构和算法实现,并介绍常用的非数值计算方法,如数据插入、删除、排序、查找检索等,使学生掌握各种数据结构的特点和算法思想,并能结合具体应用,运用各种数据结构和算法解决实际问题。但大部分高校《数据结构》课程的教学效果都不尽如人意,影响课程学致有如下原因:
1.程序设计课程掌握较差,基础薄弱。
2.实践机会少,动手能力差。
3.缺乏课外辅导,学生自学时障碍重重。
三、解决方法
鉴于以上几点,可以从这几方面进行教学改革:
1.加大对先行课程的重视程度。首先加大C程序设计课程的课时。C程序设计课程是数据结构课程的直接先行课,因此,学好C语言,为后续若干课程的学习打好坚实的基础。另外,增加数学及线性代数课程的课时。学习算法离不开数学的思想,学习数组的存储结构也离不开线性代数的应用。最后,增加了32课时的C程序设计课程设计。
2.实际操作方面,计算机专业要求有很高的实际操作技能,而我们的学生在长期被动的学习过程中却养成了勤于动脑,懒于动手的学习特点,这样教出的学生却是不能满足实际工作要求的。因此,数据结构的实验教学要紧密配合理论教学,通过相关实验与课程设计,帮助和加深对数据结构的整体理解,所以在本课程结束前安排两周实践进行课程设计,不要求实现过多的项目,但每个学生都要动手去做,亲身经历从需求分析到算法分析,最后的代码编写与调试这样的过程,从而更深刻的理解数据结构的逻辑结构、存储结构以及在某种具体的存储结构下的运算及其实现方法。
3.构建《数据结构》网络视频课程,加强师生互动环节。为了弥补课外辅导的缺陷,制作与《数据结构》课程内容相适应的视频,尤其是该课程中典型的算法及其实现过程,学生在课外学习时遇到问题可随时登录校园网观看视频,进行查漏补缺,达到巩固知识的效果。另外,在网站上可以设置在线答疑或留言功能,从而实现师生互动。
四、改革成果
根据以上改革方法,经过实施,数据结构课程教学效果颇见成效,简单做以总结:
1.加大C语言程序设计课程的课时,教师能够在足够的课堂时间将课程内容系统化的进行讲解,尤其是数组、指针、结构体等重要知识。从而给数据结构课程的学习打下了夯实的基础。
2.网络视频的构建,给学生提供了更为丰富的学习参考资料。学生在课外复习时遇到不理解的算法,随时登录校园网观看视频,好像再一次回到了课堂,从而解决了疑难问题。另外,校园网上开通了该课程的在线答疑功能,学生可以通过在线答疑功能随时和任课教师进行沟通。
3.加强数据结构课内实践与课程设计的实施,学生可以将课堂上的理论知识应用于实践中。尤其是课程设计的开设,如:简单文本编辑器的设计与实现、科学计算器的设计与实现等,通过案例让学生真正体会到数据结构课程的实用性,并从本质上理解该课程的内容。
五、结束语
《数据结构》不仅是计算机科学与技术专业的专业基础课,也是大多数院校研究生入学考试的专业必考课,因此,《数据结构》课程教学的讨论将会持续下去,最终能找到一条行之有效的教学方法。以上是作者结合自己多年教学经验和体会,提出的若干改革方法,不足之处会继续探讨研究。
参考文献:
[1]李春葆.数据结构(C语言)[M].北京:清华大学出版社,2013
[2]严蔚敏.数据结构(C语言)[M].北京:清华大学出版社,2011
篇10
关键词: 编程能力; 教学方法; 算法; 程序设计; 实践
中图分类号:TP3-0 文献标识码:B 文章编号:1006-8228(2013)08-61-02
0 引言
数据结构是计算机专业及计算机相关专业的一门实践性较强的软件基础课,它内容繁多,涉及面广,主要研究如何把具有一定逻辑关系的数据在计算机中存储,它是对数据进行操作的有关算法研究的一门学科[1],它以程序设计为基础,对学生进行较复杂程序设计的训练,课程以提高学生的编程能力培养为主要目标。本文对数据结构的教学方法和实践环节进行探讨。
1 注重教学方法,提高学生的认识能力
在数据结构课程教学中为了提高学生的编程能力,应注重课堂的教学方法,使学生能更好地掌握课程内容,理解前人设计的算法,为此我们研究了数据结构的教学方法。现代教学论中,人们把教学方法归为两大类:一类是程序式教学法,其特点是课堂以教师为中心,有计划有步骤地教给学生教学大纲上规定的知识;另一类是发现式教学法,这种教学法的基本目的不再局限于把前人整理好的知识传授给学生,而是引导、鼓励学生尽可能参与探索知识的过程,其侧重点在于使学生领悟和掌握形成知识的过程和获取知识的方法。
在教学过程中,我们将这两种方法相结合,在讲解数据结构理论基础知识时主要采用程序式教学法,始终抓住什么是“数据结构”这根主线,按照数据结构的逻辑结构、存储结构、运算和运算的实现这四步逐层展开讨论,做到教学思路清晰、逻辑性强,引导学生理解程序的运行原理和过程,并且对于不同层次的学生具体采用不同的方法。在讲解数据结构算法的实现时,我们发现有些班的学生对编程普遍怀有恐惧感,针对这种情况教师与学生一起按常人的逻辑思维方式考虑解决问题的方法,归纳出解决问题的方法和步骤,按方法和步骤与学生一起一步一步地写出程序,然后回过去重读一遍程序,并将不够理想的地方加以改进,使学生知道原来教师考虑问题的思路和自己的思路基本是一样的,这样引导学生编程的过程可使学生获益匪浅,再经过大量地由浅入深地训练后,学生消除了恐惧感,增强了信心,对编程逐渐也产生了兴趣。
数据结构中的内容很丰富,为使学生更好地掌握,我们将教学重点放在使用广泛的数据结构上,精讲最基本的概念与方法,并在这基础上例举一些综合的算法例子,通常借助于发现式教学法的思想进行教学,提供背景材料,讲透算法思想,提出问题,鼓励学生思考、分析,举一反三,让学生自己设计出多种算法。例如,在讲解数据结构中的递归算法时,由于递归算法是数据结构中最难掌握的内容之一,学生一般不能很快接受,因此讲解递归算法的方法很重要。我们先从学生较易接受的数学函数计算入手,进而引入非数值的递归算法,为了使学生了解嵌套调用、层层返回等概念,画出递归运行的状态图和栈的变化图,告诉学生嵌套调用和返回的含义,概括出“递归进入一层,则进栈,递归退出一层,则退栈”的方法,使学生一目了然。在掌握了基本递归算法及运行过程后,进一步例举稍难的递归算法,使学生从多个方面加深对递归算法的理解,这对数据结构后续内容中的树、图、查找和排序算法设计的学习是很有帮助的。
2 注重常用的、经典算法的学习,以激起探索研究的愿望
在数据结构课程教学过程中我们强调基本的编程方法和常用的算法的介绍,并指导学生积累常用算法,积累经典的好算法,例如查找算法、排序算法、遍历算法和图操作算法等,这样使学生在解决复杂问题之前掌握可使用的基本方法,可借鉴好算法的思想来拓展自己的思路。
数据结构中有很多经典的好算法,它们是著名的计算机科学家的成果。我们不仅要学习算法的设计思想,还要学习算法设计的思维方式,以提高学生的逻辑思维能力。以最小生成树两种方法为例,①普里姆(Prim)算法以图中的点为主,通过点朝最小边权伸张出去的方式来求解,其时间复杂度为O(n2)(n为图的顶点个数),它与图中的边数无关,因此适用于求边稠密的图的最小生成树,但在如何判断加入一条边而不形成回路的问题上就遇到了困难;②克鲁斯卡尔(Kruskal)求最小生成树算法以边为主,容易判断加入新顶点是否产生回路的问题,其时间复杂度为O(eloge)(e为图中边的个数),因此适合求边稀疏的图的最小生成树。求解同一个问题时,不同的算法具备不同的特点,适应不同的范围,这样分析讨论,可使学生思路畅通,激发起探研的愿望。再例,数据结构中的排序算法可分类讨论,由个别到一般,由具体到抽象形成算法的设计,并进行算法的初步分析,其中有些算法的分析并未得到完整的答案,例如,希尔排序的分析就是一个复杂的问题,因为它的时间复杂度是所取“增量”序列的函数,只是得出一些局部的结论。虽然我们不一定要引导学生去专门钻研这些难题,但是,提出并分析这些问题至少可以提高学生的学习兴趣,形成研究问题的情景,对数据结构中的许多问题留下思考和探索的空间,从中启发出今后需要深入研究的问题,这样有利于对学生能力的培养。
3 加强实验环节,以提高学生的编程能力
数据结构是一门理论和实践性都很强的课程,学习它的主要目的是提高学生的编程能力,而学会编程、提高编程的能力并不是轻而易举的,要通过长时间的实践锻炼,要学生自己多动手去体验,有些问题只有通过实践后才能明白,也只有实践才能把教师和书本上的知识变成自己的。因此我们在教学过程中针对每个环节都布置一定数量的上机实践题目,有基础题、有综合题,还有结合实际的综合应用题。例如基础题有顺序表、链表的创建、查找、插入、删除;栈、队列的操作;二叉树的遍历;图的存储实现;查找;排序等。综合题有一种结构上的综合操作题如两个链表的合并操作就是查找、插入和删除基本操作的综合,还有多种结构上的综合操作题,如图的遍历搜索演示实验,它可综合考查学生对字符串、链表、栈、队列、图的遍历和递归算法等的理解和综合应用能力,这种实验题知识点覆盖了数据结构的绝大部分内容,具有较强的综合性。我们举几个结合实际应用的例题。
例1:用二叉排序树与单链表相结合来实现学生成绩管理。
用二叉排序树存放成绩,用链表存放学生信息,相同成绩的学生连在一个链表中并由二叉排序树相应结点指向,具体链表结点形式:
二叉树结点形式:
程序具有前序、中序、后序遍历浏览所有信息功能、有各信息查询功能、有统计成绩功能、有链表结点插入和树结点插入功能,有链表结点删除和树结点删除等功能,对编程基础好的学生还要求将二叉排序树改为平衡树来完成。
例2:用栈解决算术表达式求值演示。根据算符优先关系,实现算术四则混合运算表达式的求值,演示在求值中运算符栈、操作数栈、输入字符和主要操作的变化过程。
例3:用栈队列进行停车场管理。以栈模拟停车场,以队列模拟车场外的通道,从输入的数据序列进行模拟管理。
例4:用图进行上海导游咨询。以图中顶点表示上海各主要景点,存放景点名称、代号、简介等,以边表示路径,存放路径长度等相关信息,程序具有为游客提供各景点相关信息的查询,有查询任意两个景点之间的最短路径等功能。
为了达到预期实验效果,在做每个实验时,要求学生上机运行所编程序,教师认真检查程序运行结果及程序的测试数据,必要时查看学生所编写的程序,了解他们的编程思想;将编程风格好、解决方案好的程序作为例子给学生讲解,鼓励他们多观察、分析、比较、积累,遇到问题时多想几种解决方案;通过分析这些程序,培养学生良好的编程习惯,让他们明白编程风格的好坏在很大程度上影响程序的质量。良好的编程风格可以使程序结构清晰合理,且使程序代码便于维护。我们经过这样大量的上机实践,使学生的编程能力、上机调试能力得到很大的提高。
4 结束语
本文探讨了提高学生编程能力的具体教学措施,这些措施需要结合教学方法灵活地加以运用。我们积累了大量的教学实验用例,帮助学生开阔视野,增强学习的动力,进而提高学生学习的自觉性,使他们的学习过程走向良性循环的轨道。我们经过几年的数据结构教学实践,学生的编程能力普遍提高,证明了上述教学方法是有效的。
参考文献:
[1] 严蔚敏,吴伟民.数据结构(C语言版)[M].清华大学出版社,2011.
[2] 许自龙.关于《数据结构》的教学实践和体会[J].信息技术教学与研究,2012.4.
[3] 吕国英.算法设计与分析(第二版)[M].清华大学出版社,2011.