前言:一篇好文章的诞生,需要你不断地搜集资料、整理思路,本站小编为你收集了丰富的数据结构与算法主题范文,仅供参考,欢迎阅读并收藏。
关键词 算法与数据结构 理论教学 教学技巧
中图分类号:G424 文献标识码:A
Discussion on Algorithms and Data Structures Theory Teaching Skills
ZHOU Zhanglan
(College of Computer Science, Yangtze University, Jingzhou, Hubei 434023)
Abstract In the "Algorithms and Data Structures" course, theoretical teaching is very important. In order to obtain a limited teaching good teaching effect is not easy. This understanding of knowledge points respectively, classroom inspiration, knowledge and consolidation of four aspects of the introduction of certain teaching techniques introduced in order to achieve the full content of classroom teaching, active classroom atmosphere, enhance students' interest in learning.
Key words Algorithms and Data Structures; theory teaching; teaching skills
算法与数据结构是计算机专业重要的核心课程之一。该门课程中涉及众多复杂而抽象的概念、算法,多数学生表示学习起来感觉较为枯燥。对主讲教师来说,如何让学生在有限的理论课堂教学中掌握所有知识并灵活应用是不容易的。当然,现在有很多教学手段可以达到增强教学效果、吸引学生注意力的目的。比如,在教学过程中引入精美的PPT课件、动态教学演示系统等。但是,这些手段都只能起到辅助教学的作用。教师在充分利用这些教学工具时,更应该发挥操控者灵活处理问题并解决问题的能力,以达到更加完美的教学效果。本文就课堂教学中的几点经验进行总结,以供探讨。
1 生动的语言,形象的比喻——知识点的理解
算法与数据结构课程中的知识点,尤其是每章涉及的重要概念和算法对于初学的学生而言不太容易接受。为了使学生能在课堂教学中尽快地理解和掌握这些知识,教师在教学中运用生动的语言和形象的比喻往往能够起到较好的作用。首先,关于上课的语言问题。作为一门专业课程,特别是计算机专业的核心课程,教师的授课过程总体来说应该是严谨的。专业课教师是不可能把授课对象当成小学生,然后用活泼的语气配合可爱的动作来讲解的。因此,这里提到的“生动的语言”包含两方面的内容。一方面指教师授课的语气,不要让整堂课总是一板一眼像作报告一样,在重点需要强调的地方适当加重语气,或者停顿后再次强调,抑扬顿挫的语气更能使学生提高注意力和关注度。另一方面是教师的肢体语言,在加强语气的同时配合相应的手势等肢体动作。当然,这方面与教师的个人授课风格有很大关系。
其次,形象的比喻。本课程在学习中涉及的知识点较多,学生首先要在对概念的充分理解的基础上,才能进一步学会灵活应用。为帮助学生更好地理解有关概念,可以引入生活中常见的问题做比喻。下面以在课堂上讲解链式存储结构与顺序存储结构的区别为例,说明引入适当的比喻有助于学生对两者的理解。由于链式结构不需要预先指定存储空间的大小。因此,插入和删除等操作都较为容易,特别是插入操作不存在扩容问题。而顺序结构则需在初始化阶段申请指定大小的存储空间,只有在申请成功之后才能进行其它操作。在进行插入或删除操作时都可能要移动其它元素的位置,而且当进行插入操作时,若初始空间不足还会出现需要扩容的问题。为了帮助学生理解这两种存储结构的特点,可以引入这样的比喻:顺序存储就像上课之前需要申请教室,有多少个学生就需要有一个能容下所有学生的教室。当然,在进行具体配置时要求教室的空间只能大而不能小。比如,上课的实际学生人数为60人,分配的教室为100座,而且一个学生对应一个固定的座位。当加入的听课人数超过100人时教室里的座位显然就不够用了,为了满足需求需要更换一个更大的教室。函数realloc能将已分配内存区的大小改为指定大小,①可以用来实现这一扩容操作。链式结构则不然,在进行具体配置时其空间就像是一个露天会场。进入会场的每一个人都自带一个小板凳,当人走时小板凳也被同时带走。只要不存在会场空间不够(相当于内存分配单个结点空间失败)的情况,容纳的人数是没有固定限制的。现在再来分析一下两种存储结构在操作上的不同。顺序存储的空间分配是固定的,就像教室里的固定座位。当有一个同学需要插到某一个位置坐下时,若此位置已坐人,其他同学则需要通过陆续移动为他腾空一个座位;而链式结构则不同,由于每个人都自带小板凳,只要会场有空间就能容纳新来的人。新来的人只需要把要插入的位置告诉排在其前面的人就可以了。当然,不是所有的重要知识点都能找到合适的比喻,这需要教师在备课时多思考,并在教学中灵活运用。
2 恰当的提问——课堂启发
在授课过程中,活跃的课堂气氛需要教师和学生之间的良性互动,而提问是一个很好的实现互动的方法。但是以什么方式提问、怎样提问还是有一定讲究的。首先,关于提问的方式。对于大学课堂来说,点名回答或自愿回答都可能会出现学生不配合的情况,毕竟大学生和中、小学生是不同的。因此,教师需要预先做好自问自答的准备。提出问题后,要留给学生一定的思考时间。若在这之后有学生能主动给出较好的解决方案,则应给予及时的鼓励和赞扬;反之,教师需要自己给出一个粗略的解决思路,将疑问留给学生并促使学生继续思考。其次,关于提问的内容。提问需要占用课堂教学时间,因此提出的问题应当是最重要、最具有启发性的。比如,以单链表基本操作插入算法②为例:
Status ListInsert_L(LinkList &L,int i, ElemType e){
p=L; j=0;
while(p&&jnext;++j;}
if(!p||j>i-1) return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e; s->next=p->next;
p->next=s;
return OK;
}
对于算法中“if(!p||j>i-1) return ERROR;”这条语句的作用很多同学在初学时并没有真正了解,只是在具体实现时生搬硬套。为了引起学生的注意,教师可以在上课时现场运行此算法,并在去掉此语句后输入数据进行验证。例如,给i赋一个不超出线性表长度的合法的值,这样不影响输出结果,提出这句是不是可有可无的问题,然后留下疑问让学生去思考。当然,在下次解答时要对这类问题进行总结,强调错误处理在编程中的重要性。
3 有趣的例子——知识点的引入
在专业课程的教学中就其知识点来说是较为枯燥的,为了让学生在刚开始学习新内容时就能激发出学习的兴趣,可以通过引入具体实例来达到目的。例如,以循环链表的使用为例。在讲授什么是循环链表之前,先给出一个“约瑟夫问题”游戏的例子,通过这个游戏提出问题:若使用已经学过的单链表是否合适。如果不合适,具体在什么地方不合适。然后引入循环链表的概念,并以此例子来说明循环链表的意义和具体的操作方法。另外一个比较典型的例子是用铁路调度站表示“栈”问题,这也是一个很好的利用生活中的实例来引入知识点从而引起学生兴趣的例子。尤其是在对“栈”的先进后出特性讲解时具有很好的效果。当然,例子的引入要恰如其分才能起到正面作用,过于简单或不合适的引用反倒会引起学生的反感,甚至成为笑话。
4 编程演示——知识点的巩固
在算法与数据结构课程中涉及到了大量的经典算法,比如最短路径、关键路径等。对于学生来说掌握其原理就可以知其应用。但是,对有些需要灵活使用的知识点仅讲解原理是不够的。为了能让学生深刻理解并熟练掌握,可以在课堂上编程逐步演示其实现过程。比如,“树”这一章的内容涉及的概念较多,它又是学生学到的第一种非线性结构,相比之前的线性表实现起来更复杂。因此,教师在初次讲解时很有必要在课堂上将二叉树的创建过程动态地演示给学生,这其中包括顺序存储和链式存储。当然,演示过程最好不是已经写好的完整的程序或演示系统成品,而是采用边讲解边书写的方式,使学生更容易了解编程的过程。为了节省课堂时间,可以先写好程序框架,比如程序包含的头文件、所需结构体类型、主函数、输出函数等在讲解过程中简单带过,而重要函数的核心代码则边讲边写。这样不仅可以增强学生的学习兴趣,促使学生自己去编程实践,更重要的是可以让学生非常清楚地了解实现的过程。当然,这很考验教师的编程能力,因为在课堂上临时写很有可能因为一时大意使得程序运行出错而陷入尴尬的境地,从而影响课堂教学的完整性和完美性。但教学的目的不是让教师去展示个人风采,而是讲授知识。从另一方面来讲,学生也是宽容的。教师偶尔的一次失误不仅不会影响其权威性,反而更能让学生感受到亲切而真实。
算法与数据结构作为一门重要的专业课程,要想取得良好的教学效果还需要多方面的配合。当然,作为主讲人的任课教师对课程的教学起到了决定性的作用。除了依据授课对象的特点合理安排教学计划、教学内容外,把握好有限的理论课堂教学,利用各种方法和手段将理论知识讲解清楚,使得教学内容生动、课堂气氛活跃、学生学习兴趣浓厚是很重要的。这不仅能帮助学生更好地掌握本门课程的理论知识,更能为学生在后续学习中进行具体实践打下良好的基础。
注释
关键词:数据结构;算法;教学改革;实践
中图分类号:G424 文献标识码:A 文章编号:1009-3044(2014)32-7677-02
Abstract: Data Structure and Algorithm is the core course of computer specialty, and plays a decisive role in the employment of students. This paper analyzes the teaching situation of the course at present, and summarizes some urgent problems to be resolved. The reform measures response to the problems above are described and practiced. This paper has certain reference meaning to teaching of Data Structure and Algorithm and the associated computer courses.
Key words: data structure; algorithm; teaching reform; practice
“数据结构和算法”课程涉及数据在计算机中的表示、组织与处理,以及相应的算法设计和算法性能分析,为计算机软件开发人员提供必要的专业基础知识和技能训练,同时也是计算机应用相关学科所必须掌握的课程。通过本课程的学习,使学生熟练掌握计算机程序设计中常见的各种数据的逻辑结构、存储结构及相应的运算,初步掌握算法的时间分析和空间分析的技术,并能根据计算机加工的数据特性运用数据结构的知识和技巧设计出更好的算法和程序,培养了大家数据抽象能力、算法构造性思维方法能力及逻辑思维能力,并进一步培养基本的良好的程序设计能力。其中的知识与方法,无论对学生进一步学习计算机领域的其他课程,还是对今后从事研究、应用开发及技术管理工作都发挥着重要的作用。但本课程理论性强,算法抽象,理解困难,不易掌握。该文针对高职的实际情况,对“数据结构和算法”课程教学改革进行了探索和实践。
1 教学现状分析
“数据结构和算法”课程历来被看作是计算机专业的教学难点。多年来,学生普遍感觉此课程学习困难、难以理解、不好掌握。主要有如下几个原因:1) 学生文化基础普遍偏差、参差不齐。学生入学成绩分数相对较低并且相差悬殊,对问题的分析能力、逻辑思维能力较弱,缺乏正确的学习方法。2) 自我管理和自我约束能力不强、缺乏学习的积极性和主动性。大学学习给予同学们的自学空间较大,管理方面也不如中学那样严格,从而导致学生上课听不懂、下课不愿学。3) 没有端正的学习态度。高职学生受到高中时个别老师的误导,以为上大学玩玩也可以顺利毕业,找到工作。同时也受到大学期间个别老师的误导,以为期末划划重点,最后突击,背背题目就可以过关。课上上网、玩手机、打游戏等等,课下不投入精力。4) 学生的计算机科学理论有所欠缺,对理论化的教学方法感到吃力。高职计算机课程主要以实用为主,课上理论讲授较少或几乎没有,学生对理论内容有畏难情绪,难以接受。5) 学生的前导课程基础不牢。学生普遍程序设计课程掌握的不好,没有养成独立的思维和良好的学习习惯,缺乏实际动手能力或动手能力不强。6) 实验内容设置不合理。实验大部分是验证性的,学生不需要自己去考虑各种可能的解决方案并找到最合适的方法,上机编程变成了简单的文字输人。7) 教师现场指导顾此失彼。由于学生人数相对较多,程序代码开发过程中学生问题各异,在课程有限的时间里辅导不能及时到位。8) 考核机制不完善,课程成绩主要是根据学生上机的出勤和提交的实验报告情况,再与期末考试结合给出,平时激励不到位,考核不合理。
2 教学改革与实践
通过上面对目前教学中存在问题的分析,我们明确了传统的课程教学已经不适应新形势的要求,实践动手能力欠缺,思维僵化和编程能力不强的学生,没有就业竞争力。这就要求数据结构和算法课程教师结合高职的实际情况,从数据结构的教学特点出发,明确教学目的,制订合理教学方案,强化学生解决问题的思维能力和实际动手能力,提高学生的编程能力,真正提高教学效果,最终提升学生的就业竞争力。针对以上问题,该文给出了如下的教学对策:
1) 针对高职学生文化基础普遍较差,学习习惯不好,自我管理和自我约束能力不强,缺乏学习的主动性等特点,我们在数据结构课程教学过程中引入了趣味教学,并加强教师与学生间的沟通。趣味教学旨在改变传统的教学方法和教学手段#活跃课堂气氛,把枯燥、抽象的知识通过某种有趣的、学生易于接受的方式表现出来,从而达到提高学生学习效率和教学质量的目的,它适合于任何形式的教学过程,特别适用于高职教育教学[1]。堆栈,是仅能在一端添加、删除对象的数据结构,我们可以以自助餐厅里的弹簧托盘举例,如图1所示。先来分析托盘的原理,在弹簧托盘上新增托盘后,整叠托盘重量增加,导致下面的职称弹簧被压缩,而整叠托盘的高度仍保持在一个固定的位置。拿托盘正好与此相反。之后让大家分析思考使用Java语言如何实现这样一个弹簧托盘。由于这个例子贴近生活,学生往往会有想法,课堂气氛活跃起来,能够开动脑筋,动起手来编码。实现了基本的弹簧托盘后,在引导学生一起实现一个自动弹簧托盘,让它能够给出目前的使用状态,比如有多少个托盘,托盘太多超过负荷或者没有托盘了要自动提示警告信息,让托盘变得只能起来,也就是实现我们讲授的堆栈。通过这样带有趣味性和贴近生活的例子,来调动课堂的活跃气氛,激发了学生的学习兴趣,提高学生学习的积极性和主动性,学生能够积极的预习、复习相关知识,逐渐养成良好的学习习惯。教学是一个双向互动的过程,教师在教学的过程中要从学生的实际情况出发,采用学生容易接受的教学方法讲授教学内容,才能形成良好的师生关系。教师课前备课准备好“问题”,课上通过问题引导学生积极思考,踊跃发言,将传统的“一言堂”编程“群英会”,激发学生学习的兴趣,鼓励学生之间的交流与沟通,营造融洽的课题气氛。只有这样学生对课程知识才更容易接受和掌握,才会取得良好的教学效果。
2) 针对学生没有端正的学习态度和对理论题目有畏难情绪的问题,在课堂上直接引入往届学生面试的试题或从《Java面试宝典》等书籍中挑选合适的例题来给学生讲解或让学生独立完成,比如图2中所示的题目。这个题目对高职学生有一定的难度,由于畏难情绪,大部分学生不愿意思考解答,对这种题目很是反感。但当你和学生们讲清是以后找工作的面试题时,他们明显产生兴趣,注意力一下集中起来,再加上老师在黑板上上画图分步讲解,能收到很好的教学效果。如果能将往届学生请入课堂现身说法,再加上平时课堂上对相关公司对需求人才的知识结构的宣传讲解,整个教学就能产生比较理想的效果。通过这样找工作面试直接相关的例子,来吸引学生课堂的注意力,激发学习兴趣,提高学生学习的积极性和主动性,让学生自发的产生学习的动力。
[在一个单链表中,若删除p所指结点的后续结点,则执行____。
3) 针对学生的前导课程基础不牢问题,加强对Java语言课程内容的复习和逻辑思维能力的训练。数据结构与算法课程的学习是一个承前启后的过程,如果没有学好Java课程,本课程的学习效果必将大打折扣。数据结构的算法中大量使用Java语言中的字符串、程序结构知识和集合类等编程基础知识,数据结构课程学习过程中主要就是运用这些知识点以及相关的逻辑思维能力来分析、解决问题。对于大部分刚学完Java语言的学生来说,在Java语言的运用和逻辑思维能力还不强的情况下直接切入主题,他们就会感到茫然。为了解决这个问题,在开课之初,利用一、两次课的时间来复习Java语言的相关知识,并引导学生训练课程中使用到的基本技巧和思维方式。这样才能为数据结构与算法课程的学习打下良好的基础。
4) 针对课程的实验内容设置问题,教学中要努力做到让实验内容尽量与工程实际紧密结合。数据结构是一门紧密结合实践,解决现实世界问题的课程,因此合理设汁实验对于学生解决实际问题的能力的提高有很大帮助[2]。教师在教学过程中一定要注重课程内容的实用性,并强调数据结构和相关算法的灵活应用。本人在教学过程中栈结构应用选取了迷宫问题作为教学考核案例,队列结构应用选取银行排队仿真系统作为考核案例,串处理应用选取文本编辑器作为考核案例,图结构的实现和应用选取旅游线路安排系统作为考核案例。通过贴近实际的案例,学生学到实用开发技能,并训练了将理论结合到实际项目开发中去的实用技能,才能取得较好效果。
5) 针对教师现场指导不到位的问题,我们采用分组教学模式。有学生组成4-6人为一组的学习小组,针对学生对所学内容不同的掌握程度,对学生区别对待,选拨知识掌握较好并有一定组织能力的优秀学生作为组长,让组长辅导组员,让优秀学生在帮助
别人解决问题的同时提高自己的能力,让他们带领组员共同开发,当组长不能解决时,再由老师解答。这样往往由于进取心和好胜心的趋势,作为组长的同学更能认真、踏实的学习,进步明显。而对与学习稍差一些的学生适当降低要求,并且让组长及时指导,增强他们学习的信心,他们也能迅速跟上。这样就照顾到了全班学生的不同学习情况,能让所有同学都能稳步提高。
6) 针对课程考核不完善的问题,我们采用多样化的考核方法。在数据结构与算法课程教学过程中实用了全方位、多角度的考核方式。我们把职业素养、实际操作、技能比赛相结合,把学院期中、期末考核与认证考试考核相结合,强调项目实践能力。考核时间由期中、期末这样的点拉长为过程考核的线,过程性考核与结果性考核相结合。考核主体由个人变为个人与小组考核相结合,并且自评、互评与教师评价相结合。多样化的考核让学生更充分的利用了在校时间,促进了学生的学习。
3 结束语
数据结构这门课程不论对学生学习还是教师教学都有一定难度,优秀的教学方法和高效的实施方案值得我们去研究。教学改革不是目标,而是一个过程,需要在教学过程中通过不断地探索、总结,形成一个集教学内容、教学方法、教学手段和考核方式等完整的教学体系,提高学生运用数据结构的知识分析问题、运用相应的算法动手编程解决问题的能力,努力提升课程的教学效果。该文分析了目前数据结构与算法课程存在的问题并给出了教学改革的举措并进行了实践,取得了一定的效果,下一步我们将本文的教学改革成果应用于移动教学平台上,期待能发挥更大的作用。
参考文献:
[1] 王剑, 钟元生, 罗成, 等. 高职数据结构课程趣味教学的实践[J]. 职教论坛, 2010(17):31-32.
[2] 申华, 肖莹莹. 数椐结构课程的实践性教学模式[J]. 计算机教育, 20l2(4):103-105.
[3] 唐玉媛. 高职院校数据结构课程教学研究[J]河北师范大学学报:教育科学版, 2009,11(04):127-129.
[4] 蔡红. 高职数据结构课程教学改革探索[J]. 中国职业技术教育, 2011(14):87-89.
[5] 陈广. 高职“数据结构”课程教学改革研究[J]. 教育与职业, 2011(27):35-36.
关键词:数据结构与算法;项目导向;教学;研究;实践
学习数据结构和算法的过程就是训练算法的设计技巧和能力的过程,在建设性思维能力培养的过程中,注重培养学生的数据抽象、设计算法和开发软件的能力。在学习了这门课程之后,让学生获得正确的读、写结构以及使用软件工程的理论、技能和能力,让学生初步具备分析问题和解决问题的能力,具备的设计风格趋于良好,给学生外来的学习打下坚实的基础,以便于学生在该领域可以继续学习和研究。要想培养更多的计算机专业应用型人才,就需要让他们具有找到问题并具备从概念层、抽象层中剥离并对其进行计算机系统的综合设计的能力,为了让这些问题得到解决,把项目导向的方法引入课堂教学与实践中就显得尤为重要。
一、数据结构与算法课程的问题分析
1.课程难度大,学生难以适应
数据结构和算法课程不仅逻辑性较强,同时其实践性也很强,在过去进行教学的时候,由于该课程比较抽象,同时概念比较多而且算法也比较复杂,对教师来讲该课程教学难度比较大,同时学生也对该课程产生了畏惧感,在学习的过程中没有学以致用的体验,让学生对其的学习失去积极性,最终培养的学生在这方面实践能力不高,动手能力较差,教学质量的提高也无从谈起,这和推进素质教育的今天严重不符。
2.课程理论与实践脱节
本课程注重学生的理论和抽象思维的理解,目前要想让学生不经过实践就对课程理论很好地理解是很不现实的。以前的授课模式多多少少都存在轻视实践、重视理论的讲解,教师感觉课程授课难度大,学生觉得似乎理解了所学的知识,但是在解决实际问题的时候又不会联想使用所学的知识,一个很重要的原因是在理论教学的过程中,学生对抽象数据的概念没有很好地了解,即使在课堂上听懂了也不会内化为自身的能力,也就意味着不能迁移到实际问题的解决过程中。随着时间的推移,一些学生慢慢地失去了学习的兴趣,对学生专业素质、应用能力和创新能力的提高是影响最大的因素。
3.学生在学习过程中处于被动地位
教师对知识进行强行的灌输,对学生进行“填鸭式”的教学是传统的教学模式,在这个模式中,学生学习的比较被动,对于现代大学生构造知识体系来讲是非常不利的。也就是说,学生不能在解决问题的时候学到知识,同时在遇到实际问题需要去解决的时候,感觉自己无能为力,对于自己所学到的知识不会迁移和应用。随着时间的推移,因为学生不能积极参与教学活动和及时对知识体系进行建构,对学习效果产生了极大的影响。为了对这种教学模式进行改变,让学生在学习过程中真正地掌握到知识,让自身的专业素质进一步提高,在教学实践中我们不难看出,对数据结构与算法课程使用项目导向的教学方式是比较好的。这不仅有利于学生知识体系的构建,还有利于提升学生的实践能力,让知识来源于生活和应用于生活,突出知识的实用性和有效性,增强学生学习的动力和积极性。
二、基于项目导向的数据结构与算法课程的教学改革
1.课程内容的设计
(1)理论与实践相结合,让课程的应用性进一步提升
在设计数据结构与算法课程内容的时候,应把知识的接受融入完成任务的过程中。比如,在“学生信息管理系统”的设计时,必须有搜索、排序和学生名字有关的统计等操作。把知识点等引入这些具体的操作之中,这样可以让具体的操作代替原本抽象的理论,这样可以给学生一种比较真实的感觉,不仅有助于对知识点的理解,而且还把困难的知识变得通俗易懂。在主数据存储操作的同时,与此相关和有联系的算法或应用,让学生尝试着去学习和掌握,这样渐渐地一个有效的知识体系就会被建立起来。
(2)教学内容的组织以职业能力目标为依据
课程刚开始的时候,首先教师要对该课程进行概述,在讲解基本概念的时候要引入案例,如数据、记录、逻辑结构和物理结构等,这样学生就会了解到数据结构与算法课程和专业的关系以及对该课程的研究内涵和轮廓有一个基本的了解,为项目教学打下良好的基础。然后以实际的任务为教学的主线,按照行动导向,“教学、学习和实践”一体化教学模式,完成八个学习的情境,这样专业的技能和方法学生就会掌握。与此同时,也要兼顾学生的可持续发展,他们不仅学习岗位上的数据结构类型,也要让他们能够在全局上掌握工作。教师对课本的知识进行总结后传授给学生,提高学生项目开发的能力。
2.教学模式和教学方法设计
(1)课程以项目为驱动、知识点为串行,开展“教学、学习、实践”一体化的教学模式
根据学生的实际情况进行知识的建构,同时将其引入工作的过程中,在学习过程中解决问题,在解决问题的过程中对知识进行巩固。
(2)以项目驱动、工作任务步骤为主线,组织实施教学
不管是选择课程内容,还是组织教学能容,都要以实际项目工作的内容为中心,把实际工作的流程为教学内容和教学顺序,把数据结构和方法进行重组后,融化在实际工作中。这样不仅可以让学生对学习的知识进行应用,也让他们更清晰地了解项目开发工作的整体框架。实训的课程来自于学生的日常生活,学生要完成的项目任务,需用户的需求、数据流分析、数据存储的表示到算法、功能的实现和提交各阶段实用的计算机专业组产品的实际情况和公共职位的实际情况完全相同。因此,在对任务完成的过程中,学生就可以对相关的知识、方法、技巧进行掌握,让计算机类专业群公共工作岗位能力的需求清楚地显示。
(3)参与企业生产,企业专家在生产中参与指导
数据结构与算法课程对软件开发行业来讲是一门基础课,也是必修课。在开发软件的过程中,如果没有把数据结构所谓知识进行贯穿,那么这个项目就缺少指引,也就意味着它是一个失败的项目。所以,学生参与到实习基地中的生产中的时候,其必要条件就是对数据结构与算法进行学习和使用,在教学的过程中要具有双向的选择。进入企业的都是优秀的学生,在企业中从事具体的工作,实现“课堂与企业”的完美结合,同时还要把工作过程与学习过程紧密地联系在一起,这样教学效果就会大幅度提升。
以项目为导向的数据结构与算法课程,要求在教学的过程中,围绕学生这个中心,对学生的技术和个人专业素质进行全方位的培养,同时兼顾人际等多个方面的培养,我们的目标就在本科层次培养出终身学习型的高质量计算机应用和开发人才,并最终让每一个学生能够胜任他们未来的工作。同时,作为授课教师,我们要了解学生的实际需求,新一代的大学生在性格、认识等上都发生了很大的变化,我们要对其进行深入的研究和探索,按照他们的认知方式进行课程的教学,同时也要兼顾他们的认知水平,相信经过这样循序渐进的课程学习,一定会给社会培养更多的、需要的人才,让社会对计算机方面的人才需求得到满足。
参考文献:
[1]刘晓静,王晓英,薛媛媛,等.让趣味教学进驻数据结构与算法课堂[J].青海大学学报,2011,29(05):95-97.
[2]熊岳山,钱程东,徐凯.数据结构课程教学中的数据抽象能力培养体会[J].计算机工程与科学,2014,36(04):27-30.
[3]李和平,龚波林,刘万毅.深化实验教学改革,强化技能型人才培养[J].实验技术与管理,2013,30(02):159-161.
[4]王晓英,靳力,王晓青,等.基于序列匹配的作业相似度检测系统[J].计算机工程,2012,38(24):53-61.
关键词: “数据结构与算法分析” 课程群 分层实践 分段管控
课程群是对教学计划中有相互影响、互动、有序、相互间可构成完整的教学内容体系的相关几门课程组成一个课程间相互连接、相互配合、相互照应的课程群体[1]。2014年提出建设程序开发类课程群,包括C语言程序设计、C++程序设计、数据结构与算法分析、JAVA程序设计、web程序设计、组件开发技术、软件设计模式七门课程。其中“数据结构与算法分析”课程在整个课程群具有承上启下、举足轻重的地位,决定程序开发类课程群的成效。
一、“数据结构与算法分析”课程的现状
1.课程理论性强,难度大。
调研发现:非计算机专业近80%的学生都感觉课程难,即使计算机专业的有近50%的学生,感觉该课程难学,这种畏惧思想影响学习兴趣。
2.先导课程掌握不扎实,课程推进困难。
教学计划中C++程序设计、实践和该课程分别安排在第2和第3个学期。暑假将两门课割裂了,造成是否介绍先导课的困境。
3.学生动手水平参差不齐,单一的实践安排难以满足不同的需求。
目前,课程的实践安排对所有的学生相同,对于动手强的学生可能在寝室就完成题目,而对编程能力不强的学生可能根本不知该如何下手,久而久之学生就失去开发热情。
4.课程管控不足,课程考核不能反映学生的真实水平。
目前课程的评定以卷面成绩为主,实践证明有些学生根本不会写代码但他却能拿到很高的分数。
二、教学改革措施
1.课程群中相关课程开课时间的精细化安排。
(1)开课时间安排。
C++程序设计包括64上课课时和16实践课时,将C++课程实践调整到第3学期第1周上,而数据结构与算法分析课程从第2周以后开始上,这样就将两门课紧密地衔接起来。这种一门课程一分为二的方法促进了C++课程,同时也保证“数据结构与算法分析”课程的顺利进行。
(2)教学内容及学时分配。
为呼应课程群中的后续课程,该课程内容是贯穿程序设计、软件设计模式的思想和观点。该课程采用面向对象和抽象数据类型观点介绍数据结构,集中体现分解、抽象和信息隐蔽的基本原则,抽象数据类型是中枢,展示信息结构转换的三个重要阶段:数学模型、抽象数据类型、数据结构与算法。其理论教学环节的安排为:数据结构的基本概念(2),表、栈和队列(6),树(8),散列(4),优先队列(7),排序(12),不相交集(4),图论算法(7),算法设计技巧(4),摊还分析(4),高级数据结构(6);课内实践的安排:栈和队列(2),表达式树(2),散列、优先队列(2),排序(2),不相交集(2),深度优先搜索应用(2),贪心、分治算法(2),AA树、treap数(2)。
2.课堂教学模式改革
(1)注重启发式教学,建立自主学习、合作学习相结合的教学模式。
为强调思维训练,采用讲、做穿插的授课方式,教师采用示例案例授课时学生采用自主学习模式,是教-做-答疑的互动、有反馈方式。它强调教中实践、实践中思考、交流中提升;自主学习完后各小组通过“以强带弱、以老带新”的方式合作完成综合实践作业。
具体讲解时,(1)首先引入案例,然后给出C++实现的方法,最后详细展开相应数据结构及操作实现;(2)一题多解、一题多语,如对同一问题采用不同的数据结构实现方法,对比讲解,多语言实现为拓展作业;(3)难点分散,如将栈与非递归处理技术分别在栈、二叉树非递归算法、快速排序与归并排序的非递归算法等多处讲解;(4)图示讲解和动画展示相结合。
(2)标准化教学与微课程教学模式相结合。
为了确保课程的可持续发展,课程采用项目组集体备课、集体讨论、分头准备的方式。课程组骨干教师经过多次讨论后修订了课程教学大纲,形成了标准教案、PPT及算法演示视频。为充分利用学生的课余时间,采用课程微课程化,微课视频一般10分钟左右[2],选择与生活比较贴近的数据结构(比如栈、队列等)和基础实践内容微课化。
3.项目驱动的分层实践教学模式研究。
教育心理学家发现:学习是累积性的,较复杂、较高级的学习是建立在基础性的学习基础之上的[3]。因此,课程的实践教学以贯穿课程群的项目进行驱动,提出“注重基础、综合应用、提高创新”的三层次实验教学模式,以基础、设计、综合三个方面的实践能力培养为中心,全方位地培养学生的动手能力和创新能力。
基础类实践通常是对教材上所涉及的数据结构及相关操作进行上机验证,要求学生掌握相关数据结构,提高学生的软件设计规范化能力。这类实践通常在介绍完相关知识后以课程作业的方式发放,要求学生在规定时间内完成,教师以晚自习的形式进行个别指导;设计类实践要求学生对给定的题目进行数据结构的设计及算法实现,题目是从贯穿课程群中的项目案例中切割出来的。实践中我们鼓励学生一题多解,并分析不同解的时、空代价。这类实验通常是课程内实验题目,要求每个学生独自完成,教师全程指导、重点考核;综合类实践是对C++实践课程中学生已完成题目的重新设计,以小组为完成单位,人员分组原则上是C++实践的人员分组。该类实践培养学生分析、设计实际项目的能力和创新能力。教师对有强烈要求的学生通过答疑的方式进行指导。各小组完成后需要进行结题答辩,答辩中教师会对完成情况进行评价,从而引出后续课程。
4.课程考核与过程控制。
我们采用分段控制的多元化实践考核方式:期末机考30%+基础实践20%(程序代码+报告+随机面试)+设计实践40%(课前准备材料+完成代码+报告)+综合实践10%(报告+答辩)。考核方式强调对课程的过程监控,基础实践的每一次完成情况能够给教师提供重点监控的学生名单,通过晚自习的重点指导确保学生弄懂相关知识点、顺利进行实践课任务,为保证设计实践课的完成质量,要求学生在课前精心准备并提交准备材料。综合实践强调以强带弱,最后通过总结引出下一门课程,从而保持学生长久的学习动力。
三、结语
数据结构与算法设计是程序开发类课程群中最重要的一门课程,其成败直接决定整个课程群的成败。在不影响其他课程下的课程群开课时间微调保证课程的顺利进行;创新的教学课堂模式激发学生自主式、探索式学习;项目驱动的实践模式将课程群中的课程更紧密地结合起来;分层的实践教学满足不同层次学生的需求;教学过程的管控进一步确保教学的顺利推进。该课程改革对课程群中其他课程改革有积极的作用。
参考文献:
[1]马赛,李方能,吴正国,卜乐平.《信号与系统》课程群的建设与教学改革探索[J].高等教育研究学报,2010.3.
[2]梁乐明,曹俏俏,张宝辉.微课程设计模式研究—基于国内外微课程的对比分析[J].开放教育研究,2013,19(1).
[3]哈斯.《数据结构》课程中使用逐步演示法进行算法教学的实验研究[D].呼和浩特:内蒙古师范大学,2007.
关键词:数据结构;物理结构;算法
中图分类号:TP3-4 文献标识码:A 文章编号:1007-9599 (2011) 23-0000-01
Learning Methods of "Data Structure"
Guo Mingjie,Cheng Xiugui,Zheng Jialin
(Heilongjiang Mechanical and Electrical Engineering School,Suihua 152300,China)
Abstract:"Data Structure" in computer science is a very important comprehensive basic course,the content-rich,wide-ranging,but there it is difficult to apply theoretical knowledge to practical difficulties,a lot of people completing the data structure,the very loss,therefore,we need to explore,what is the data structure,data structure and how to learn.
Keywords:Data structure;Physical structure;Algorithm
《数据结构》作为一门独立的课程最早是1968年在美国的一些大学开设的;自1978年美籍华裔学者冀中田在国内首开这门课程以来,经过20余年的发展,在我国这门课程已经成为各大学计算机专业的本科主干课程,也成为非计算机类学生和研究生学习计算机的必修课程。
数据结构在计算机科学界至今没有标准的定义。每个人根据各自的理解的不同而有不同的表述方法:
Sartaj Sahni在他的《数据结构、算法与应用》一书中将将数据对象(data object)定义为“一个数据对象是实例或值的集合”。而Clifford A.Shaffer在《数据结构与算法分析》一书中将数据结构定义为:“数据结构是ADT的物理实现。”
大多数学者认为数据结构具体指同一类数据元素中,各元素之间的相互关系,包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构。
众所周知,计算机的程序是对信息进行加工处理。在大多数情况下,这些信息并不是没有组织,信息之间往往具有重要的结构关系,这就是数据结构的内容。数据的结构,直接影响算法的选择和效率。数学算法与数据的结构密切相关,算法无不依附于具体的数据结构,数据结构直接关系到算法的选择和效率。也就是说,数据结构还需要给出每种结构类型所定义的各种运算的算法。
因此,要想更好地运用计算机来解决实际问题,仅掌握几种计算机程序设计语言是难以应付当前众多的复杂的课题。要想有效的使用计算机,充分发挥计算机的性能,就必须学好和掌握好数据结构的相关知识。所以,打好“数据结构”的扎实基础,对于学习计算机其他专业知识,如操作系统、数据库管理系统、人工智能、等都是十分有益的。
虽然数据结构这门课程对于计算机专业的学者来说极其重要,但普遍反映这门课程难学,不易理解。但我们只要掌握以下几点,就一定会学好数据结构。
一、逻辑结构是基础
将要处理的数据及其关系抽象成用图形和文字描述的数学模型,这就是逻辑结构。数据的逻辑结构主要是描述数据之间的逻辑关系,而不只是数据本身。之所以称为逻辑结构,是因为它仍然是独立于计算机而客观存在的。在逻辑结构中,我们主要学习每种结构的整体特征和结构内部的各数据元素之间的逻辑关系。首先是最简单的直接逻辑关系,主要有两种:有序相邻和无序相邻。其次是间接的关系,树结构中的祖先和子孙的关系,图中的连通子图等等。越是复杂的逻辑结构,其关系种类越多,既有简单的直接关系,也有复杂的间接关系。在对逻辑结构有了全面清晰的认识之后,就应该考虑这些算法的逻辑实现过程。
二、存储结构是关键
存储结构即物理结构,是逻辑结构在计算机中实实在在的表示,包括数据的表示和数据之间所有逻辑关系的表示。在对逻辑结构的特点和各种逻辑关系都十分熟悉以后,进一步就是要学习逻辑结构所对应的物理存储结构。一般来说,每一种逻辑结构所对应的存储结构都有两大类:顺序存储结构和链式存储结构,这是因为在计算机存储器中可以用内存单元的相邻关系和地址间的指向关系来表示逻辑结构中的序关系对于顺序存储结构,主要是用物理上相邻的存储单元来存储逻辑上相邻的数据元素;而链式存储正好相反,逻辑上相邻的数据元素在内存中不一定相邻,但逻辑上相邻的元素之间有地址映象关系。一个数据元素有相邻关系的元素越多,其链式结构就越复杂,链中的结点的指针域也越多。
三、算法实现是目标
我们学习数据结构的目的是掌握这些常用结构的特征,以便在这些结构上实现各种基本操作,即算法。所谓算法,是指解决问题的办法,是用计算机语言来描述计算机的解题过程。怎样学习算法呢?这是程序设计领域一个包含很广的问题,在这里我们只讨论常见数据结构上的算法。
归根到底,要想掌是在于对结构特征的理解,包括逻辑结构和物理结构。逻辑结构是基础,物理结构是关键,在某种意义讲,是数据结例如栈是一种运算受限的线性表,它的逻辑结构特性是先进后出,所以它的插入和删除运算就和一般意义上的线性表不同,只能在端点处操作,称为入栈和出栈操作。在《数据结构》教材中提到的算法,主要有两大类:一类是建立在特定的某种数据结构之上的;另一类是可用于多种结构的在实际应用中大量使用的算法。不管是哪种算法,我们都要学会其算法思想,并能初步进行最坏情形下的时间复杂度分析,对于简单的算法,还要求能求出其平均时间复杂度握数据结构上算法的实现.
以上阐述了沿着数据及其关系的不断抽象过程来学习数据结构及其算法的方法。由于数据结构专业性很强,除了对知识基本概念的掌握和理解之外,还需要培养一定的抽象思维能力和程序设计能力,并且理论联系实践,多运行程序,将算法用于实际,这样才能真正学好数据结构。
参考文献:
[1]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2004
关键词:数据结构;算法;程序设计语言;程序设计方法;教材
一、前言
1946年2月14日,世界上第一台电子数字计算机ENIAC在美国宾夕法尼亚大学诞生。早期计算机主要用于数值计算,处理的对象是“无结构”的数据(例如整数和浮点数),它们和处理这些数据的程序(根据计算机指令系统编写的代码)都采用二进制表示形式存储在计算机的存储器中。20世纪50年代开始的“程序设计语言”研究,改变了原始的使用机器语言编程的方式,语言的“使用手册”给计算机的使用者提供了一个非常高级的“虚拟机”,使得程序员可以方便快捷地描述需要的数据和处理数据的程序;然后通过语言的“编译器”把它们成功地转换为计算机内部的二进制代码。高级语言的研究成果,打破了计算机只能进行科学计算的限制。“语言编译系统”通过计算机成功地完成从高级语言的模型到计算机硬件语言模型的转换,打开了计算机系统软件研究的大门;同时也提出许多相对比较复杂的结构化数据的需求(例如栈、散列表和二叉树等),促进了数据结构的研究和发展。
“数据结构”的概念最早是由C. A. R. Hoare和N. Wirth在1966年提出。大量关于程序设计理论的研究表明:为了系统而科学地构造大型复杂的程序,必须对这些程序中所包含的数据结构进行深入的研究。
1968年,美国教授D.E.Knuth在他的名著《计算机程序设计技巧》(第1卷 基本算法 第二章信息结构)中首次系统地研究并整理了当时经常使用的主要数据结构与相关的算法,为数据结构课程的开设提供了丰富的素材(他本人也因此书的成就,在1974年获得计算机界最高科学成就奖“图灵奖”)。
自20世纪70年代起,“数据结构”在西方国家的大学中,被普遍列为计算机本科的必修课程。
二、不同时期的教材
1978年著者已有10年从事系统软件开发的丰富经验,参加了北京大学计算机系的筹备和创建。在担任数据库教研组组长期间,按系主任张士龙教授的安排,负责“数据结构”等新课的建设。从此围绕数据结构开展的工作,包括学习与研究、讲课与编写教材等,三十多年一直没有停息。其中花费时间和精力最多的是根据教学和科研的需要编写了下面4本教材(以8种不同版本出版)。
1.第一本教材:《数据结构》
1979年教育部在南京大学召开了第一次全国计算机系教学大纲研讨会,著者带着起草的“数据结构教学大纲”和“数据库教学大纲”与系主任一起参加了会议。会上充分肯定了我们的工作,并建议我们分工负责编写数据结构教材。根据这个大纲的修改稿,著者组织教研组内的老师共同编写了第一本《数据结构》讲义。1980年起,这本讲义在校内外(包括南京大学、中山大学等国内著名高校)广泛试用,三易其稿。1987年由高等教育出版社正式出版(此书1992年获国家教委颁发的全国优秀教材奖)。
2.第二本教材:《数据结构基础》
1985年,“北京市自学考试委员会”开设计算机专业。作为数据结构课程的考试委员,著者邀请杨冬青和邵维忠两位老师共同编写了这本自学考试教材。1991年由北京大学出版社出版,第二年台湾儒林出版公司用繁体字出版。
3.第三本教材:《数据结构——C++与面向对象的途径》
20世纪90年代,面向对象的语言和方法开始流行。
根据教学和科研的需要,著者与裘宗燕老师合作编写了该教材。1998年作为国家“九五”重点教材由高等教育出版社出版,2001年出修订版。
4.第四本教材:《算法与数据结构》
1998年,著者由北京大学校长聘任,主持全校理科主干基础课“算法与数据结构”,考虑到不同专业的需要,组织理科教师共同编写了一本适合理科各专业通用的新教材。该书列为“面向21世纪教材”,2002年由高等教育出版社出版,获评“北京市高等教育精品教材”;2006年出第二版,列为“十一五”国家级规划教材,获评教育部“普通高等教育精品教材”;2012年再次修改并附著者教学光盘,出第三版。
回顾三十多年来围绕数据结构教学方面的工作,深深体会到与时俱进、精益求精地编写教材是提高教学水平的基础和关键。
三、数据结构教材需要与时俱进
计算机科学是一门高速发展的新兴科学,它的研究内容和研究方法都在不断发展。“结构”可以解释为:(1)把某些成分(成员、元素、原子等)按一定的规律或方式组织在一起的实体;或(2)把某些成分组织在一起的方式。 “数据结构”从字面上可以理解为就是以数据为成员的结构。在早期关于数据结构的论文中,一个数据结构多数情况下是指一个“实体”,而不是指“方式”。用通俗的程序语言的术语来讲,一个数据结构就可以看成一个结构化的数据。然而,计算机科学研究数据结构的目的是为了在计算机中有效地表示和处理客观世界的各种不同对象。所以我们关心的是这些数据结构如何存储在计算机中,并且能有效地完成各种需要的操作。随着计算机科学的发展,对于数据结构的教学与研究也逐步从“实体”,提高到“方式”,直到“抽象数据类型的实现”。
1.教材应该正确反映计算机科学的发展水平
前面提到的第一本教材,基本反映了20世纪70年代的认识水平。当时数据结构的许多概念还十分模糊,即使像“栈”和“队列”这些最基本的结构,它们的操作定义都不完全统一。许多教材对于什么是“数据结构”都没有解释。我们考察了20世纪70年代有影响的几本著作。其中H. A. Maurer用一个二元组B=〈K,R〉来形式地定义一个数据结构B,其中K是结点有限集合,而R是K上的关系的有限集合。C. C. Gotlieb和L. R. Gotlieb则将数据结构的定义扩充成一个五元组:〈V,O,G,M,S〉。其中V是所讨论的结构中成员取值的集合,O是结构中成员可执行的运算的集合,G是两个构成名字的文法,M是结构中各成员存放位置的集合,S是L(G) M的映射。
根据数据结构研究的目的和应用的需要,我们认为提到一种数据结构离不开以下三个方面:(1)构成数据结构的成员之间固有的逻辑关系;(2)将数据存储在计算机中的表示方法;(3)在计算机中对数据结构进行的运算或处理。将这三方面分别简称为数据的逻辑结构、存储结构和运算,所以在第一本教材中我们明确采用这三者的统一(三位一体)来非形式地定义“数据结构”的概念。
第二本《数据结构基础》以上一本教材内容为基础,根据N. Wirth教授提出的“算法+数据结构=程序”关系,把程序理解为在数据的某些特定的结构和表示的基础上对于算法的描述。算法与数据结构是程序设计中相辅相成、不可分割的两个方面。为了适合于自学考试大纲的要求,参考了A. V. Aho教授20世纪80年代的教材,采用以数据结构为主线、算法为辅线的结构编写,使得内容更加紧凑、重点更加突出。
第三本教材《数据结构——C++与面向对象的途径》是在面向对象的语言和方法开始流行的20世纪90年代,采用面向对象的设计方法讲解数据结构的内容。参考Budd的工作,由简到繁、从易到难,系统地引入各种抽象数据类型的概念和实现,并在全书最后,用类图方式总结了各种经典的抽象数据类型在教材中的相互关系。
最后一本《算法与数据结构》参考了Kurt Mehlhorn等人的观点,把“数据结构”定义为“抽象数据类型的物理实现”。提出“物理实现”的意图是强调本课程关心的“实现”应具体到可以用计算机的两个最重要的物理量(主机的运行时间和内存的存储空间)来权衡。这一观点突出了抽象数据类型在数据结构教学中的地位,包含了数据结构与面向对象技术的内在联系。使读者可以从更高的层次理解数据结构与算法的关系,也容易解释数据的逻辑结构、存储结构与运算的三者关系。
后两本教材都反映了20世纪90年代的理解水平。其共同之处是:都强调了数据结构是“抽象数据类型的实现”,前一本使用的是面向对象的实现方法,而后一本为了突出讲解实现的物理效率,没有采用面向对象的方法。
2.教材内容既要相对稳定又要逐步更新
需要指出的是,尽管计算机科学的发展使得数据结构的地位和作用产生了许多变化,但是数据结构学习的目的并没有大的改变。所以教材的内容是基本稳定的。
第一本教材按“逻辑结构、存储结构、运算和应用”四个层次的结构组建架构。全书共18章,除第一章概论外分为四大部分:第一部分是线性结构,包括顺序表、链表与动态存储管理、串、内排序和线性表的检索等五章;第二部分是树形结构,包括树形结构的概念、树形结构的存储、二叉树周游算法、树目录和树形结构的其他应用等五章;第三部分是复杂结构,包括图和多维数组与广义表两章;第四部分是文件结构,包括顺序文件、散列文件、索引顺序文件、倒排文件和外排序等五章。全书概念清楚、内容丰富、体系完整。
第二本作为自学考试教材,内容在第一本的基础上加以精简,并增加集合与字典结构,把检索归入集合的基本运算。在结构上更加强调基础、突出重点、适合自学。全书共分8章。第一章通过分析一个实际问题的求解过程,引入抽象数据类型、数据结构和算法等重要概念作为全书的引论;第二章到第五章分别讨论了表、树、集合和图等常见的各种数据结构,一般均以抽象数据类型引路,重点讨论抽象数据类型在计算机中各种不同的实现方法;第六章对链接表示所需要的动态存储管理问题作了系统的阐述;第七章综述了外存上数据结构的各种组织方式;第八章给出内排序和外排序的各种算法。
第三本由于采用了面向对象的方法,在内容上做了较大调整。增加了面向对象的方法入门和优先队列。全书共分12章:第一章,绪论;第二章,C++与面向对象初步;第三章,字符串,本章定义了一种更安全可靠的字符串类型,同时也以字符串做例子,讨论数据抽象和封装的有关问题;第四章,向量,本章建立了一种安全可靠的向量数据类型,还给出了几个主要的向量排序算法;第五章,动态数据结构——链表,主要讨论了各种常用的链表结构及其实现方法;第六章,栈和队列,介绍了栈和队列的抽象概念、具体实现及其应用;第七章,树和二叉树,介绍了树和二叉树的概念,重点介绍二叉树的实现及树结构用于快速检索的一些技术;第八章,优先队列,主要介绍了堆和斜堆的概念以及通过它们实现优先队列的方法;第九章,集合和字典;第十章,散列表;第十一章,图;第十二章,文件。在附录中用类图方式给出本书介绍的主要抽象数据类型及其相互关系图。
第四本书作为北京大学主干课“算法与数据结构”的通用教材。全书共分以下10章。第一章绪论;第二章线性表;第三章字符串;第四章栈与队列;第五章二叉树与树;第六章集合与字典;第七章高级字典结构;第八章排序,第九章图;第十章算法分析与设计,主要给读者概括地介绍算法的分析和设计的主要技术。本书在编写中注意到知识模块的独立性和相关性,不同专业的学生可以根据不同的需要进行组合使用。
在我们后编写的两本教材中,都大幅度减少了存储管理和文件系统的内容,其主要原因是它们应该分别属于“操作系统”和“数据库”的教学范围。“文件系统”又称“物理数据库”,主要讲解数据库的物理实现。在我们新编的教材中,只给出了与“字典类型”紧密相关的“索引文件”及“散列文件”介绍,也没有给出实现代码。
3.算法描述语言要配合教学的需要
数据结构的教学内容原本独立于任何一种特定的程序设计语言,但是这门课程的教与学又离不开程序设计语言的支持。在这里语言是一种教学的工具。工具的选择应该有利于表达数据结构的基本思想与算法的设计方法,有利于算法的分析与设计,并且简单明了,便于老师讲学和学生理解。前面讲的四本教材,因为在不同的时期创作,根据不同的学术观点,针对不同的读者,所以也选择了不同的算法描述语言。
在编写第一本教材时,由于国内当时主要流行的程序设计语言是Basic、Fortran和Algol60,它们不合适于描述数据结构中的许多算法,为此我们在书的附录中给出“关于书写算法的若干规定”,除了过程语言允许的基本的控制语句外,还为描述链表操作和存储管理引进了一些专用过程,以便于描述动态的存储分配和内存空间的管理功能。
第二本教材根据“算法+数据结构=程序”的观点编写,当时N. Wirth教授提出的Pascal语言已经在国内流行。它的指针可以方便地描述链表的操作,但是在描述存储管理时显得不够灵活。所以该书对其进行了简单的扩充并加入汉字的注释,称为伪Pascal语言。
第三本教材采用面向对象的设计方法讲解数据结构的内容。所以首选当前国内最流行的面向对象的程序设计语言C++来描述。学生在学习数据结构的同时,又加深了对于面向对象方法的理解,提高了使用C++语言编程的能力。
使用了良好的面向对象的C++描述,程序表面的可读性很好,但内涵十分丰富,例如各种构造函数和析构函数的自动选择和运行,各种继承和多态功能的动态处理等,所以要具体分析一个独立算法的时间和空间的代价往往比较困难。而这些内容恰恰是学习数据结构的一个重要目标,也是许多专业学生学习计算机的主要因素。加上教学计划安排的课程顺序、学时要求等因素,所以我们在编写第四本教材时选择了C语言描述。
C语言虽然是一个小语言,但具有丰富的表达能力,这使它简单、易学,又能满足基本的教学需求。另外,C语言是一个过程语言,用它描述的算法语义清晰、确定可行。特别重要的是,C比较低级,使用C描述的算法,其时间和空间代价分析最直观、准确。
四、精品教材应该精益求精
如前所述,我们希望所编的教材与时俱进,跟上计算机科学的发展步伐,使得每本教材独具特色、体系完整、结构合理。与此同时,著者对教材的每个重要环节,包括概念的定义、思想的陈述、难点的分解、算法的设计与分析方法以及教学的方法甚至书面排版的格式等,都经过认真的考虑和细心的安排。下面举几个简单的例子,从中可见一斑。
1.概念准确,语言流畅
对于基础课的教材,概念准确是十分重要的。然而由于计算机科学十分年轻,发展又快,使得许多概念在文献中没有统一的定义。例如“文件”和“记录”这两个概念在外存的讨论和内排序中都使用,但是意义不同;另外关于二叉树的“高度”和“深度”的定义,不同的数据结构教材可能不同;关于“满二叉树”的定义,不同教材的差别可能很大,等等。
为了尽可能给出所有概念的准确定义,我们花费了大量时间,反复查阅了多种不同的文献,包括数据结构和离散数学的各种教材,经过认真分析、比较,给出我们的理解,在教材最后整理了所有名词的索引。并且在第一次出现的位置注释出可能不同的定义。
语言流畅是提高教材可读性的基础。我们的几本教材多数都是从校内试用讲义开始,反复修改,出版后也再版甚至三版,对于局部小修改有的就利用加印的机会进行。其中修改最多的是语言文字,包括标点符号的修改,通过润色使其更加准确、流畅。应该承认,广大学生的参与为本书文字的加工作出了很大的贡献。
2.重点突出,难点讲透
数据结构的内容十分丰富,难度也比较大。著者的主要工作是准确讲解该讲的内容,把重点要讲透彻,把难点加以分解,使得读者容易学习和理解。数据结构教学的重点是讲解经典抽象数据类型的各种实现方法;难点则是算法的设计、实现和分析比较。
为此,我们在教材中每章的最后都编写了“小结”,明确指出本章的难点和重点。为了便于教学,我们的教材特别注意将讲解知识和培养能力并行:不但讲解一个抽象数据类型可以采取的常用表示形式,同时还指出不同表示的特点和各种表示使用的环境;不但讲解如何在选定的存储表示上正确实现抽象数据类型要求的各种操作,同时还强调不同存储表示对算法效率的影响;不但讲解单个算法的设计和实现方法,同时也强调同类算法之间的共性,并且在教材最后对学到的主要算法进行总结,以提高学生利用学到的知识去解决实际问题的能力。
3.算法逐步求精,程序简明可读
设计一个算法时,如何从思想出发,逐步细化直到变成程序语言的代码?阅读一个程序代码时,如何分解一个算法程序,正确理解这个程序完成的算法功能?这是学习数据结构课程的学生的共同问题,也是一般数据结构教材难以书写清楚、教师难以讲解明白的问题。
为了帮助老师和学生解决上述问题,我们在教材的第一章,都用一个实际问题生动地介绍了使用计算机求解的全过程,还增加了从算法思想到代码实现逐步求精的具体例子。对于教材中比较难理解的算法,一般都是先提出问题,然后对实例进行分析,给出解决的方法,再整理出算法的思路,最后通过逐步求精得到程序代码;而在讲解这个程序代码时,利用电子课件的灵活方式,结合算法的思想,自顶向下进行分解。为此,我们对教材的代码的结构如何与算法思想更加一致,语句(特别是存在多种不同循环语句时)的选择尽可能简单明了,如何引进局部变量使得程序更为简短等,都进行反复改进。力求书中提供的程序具有高度的简明性和可读性。
我们知道程序是没有“标准答案”的,但是高水平的程序员能够根据语言的风格和编程的艺术,编写出更美、更能体现算法魅力的艺术珍品。我们为此尽力而为。
4.利用多种方式,提高学习兴趣和教学质量
除了上述的工作以外,著者还编写出版了《数据结构与算法学习辅导及习题详解》和《算法与数据结构(第2版)学习指导与习题解析》;作为《算法与数据结构——C语言描述(第三版)》的附件,整理并出版了《“算法与数据结构”课程录像》的完整光盘和全部课件;还完成了一个《数据结构、算法和问题求解》三维的网络课件;设计了一个《数据结构中算法的可视化演示》软件框架等。
在从事数据结构教学的同时,著者还发表了十多篇与数据结构相关的研究论文,其中关于“三叉树结构的设计和实现” 研究成果获得国家专利。指导学生提出一种基于对象的数据结构教学小语言——ALL,设计了数据结构中主要算法的ALL语言程序,并且实现了ALL语言程序到目前流行语言(JAVA、C++、C等)的自动转换。
为帮助学生深入理解算法与数据结构的精髓、提高学生的学习兴趣,我们还在北京大学教学网上开辟专栏,引导学生进行广泛讨论,受到学生的热烈欢迎。通过这些讨论,大大丰富了学生的知识范围,激发了学生自主学习的热情,也弥补了书面作业和上机作业的局限。
光阴似箭,日月如梭,著者围绕“数据结构”教学和研究的三十多年正是数据结构在我国从引介到发展的三十多年。在此前,著者曾有十年“系统软件”开发经验,因而一接触“数据结构”就产生了极大兴趣,能够很快体会到其中的真谛;加上个人长期从事“程序设计语言”和“软件理论”的研究,教学与科研相辅相成、互相促进。在辛勤耕耘的同时,个人也享受着授业解惑的快乐,体会到人生的价值。
参考文献:
[1] 许卓群,张乃孝,杨冬青等. 数据结构[M]. 北京:高等教育出版社,1987.
[2] 张乃孝等. 数据结构基础[M]. 北京:北京大学出版社,1991;台湾儒林出版公司(繁体版),1992.
[3] 张乃孝,裘宗燕. 数据结构——C++与面向对象的途径[M]. 北京:高等教育出版社,1998第一版,2001修订版.
[4] 张乃孝等. 算法与数据结构——C语言描述[M]. 北京:高等教育出版社,2002第一版,2006第二版,2012第三版(附教学光盘).
[5] 张乃孝. 算法与数据结构(第2版)学习指导与习题解析[M]. 北京:高等教育出版社,2009.
[6] Knuth D E. The Art of Computer Programming[M]. Addison Wesley Publishing Company, 1973.
[7] Horowitz E, Sahni S. 数据结构基础[M]. 程惟宁译. 北京:国防工业出版社,1983.
[8] Wirth N. Algorithms + Data Structures = Programs[M]. Prentice Hall, 1976.
[9] Maurer H. A. Data Structures and Programming Techniques[M]. Prentice Hall, 1977.
[10] Gotlieb C C, Gotlieb L R. Data Types and Structures[M]. Prentice Hall,1978.
[11] Aho A V, Hopcroft J E, Ullman J D. Data Structures and Algorithms[M]. Addison Wesley Publishing Company, 1983.
[12] Mehlhorn K, Tsakalidis A. Data Structures .Handbook of Theoretical Computer Science [M]. Elsevier, 1990.
[13] Budd T A. Classic Data Structures in C++[M]. Addison Wesley Publishing Company, 1994.
[14] 张乃孝,于晓迪. 有关C语法形式化中若干问题的探讨[J].计算机工程与应用,1985(2):1-5.
[15] 张乃孝. 数据结构体系分析[J]. 计算机研究与发展,1988,25(5):36-40.
[16] 张乃孝. 知识结构的三叉树表示及逻辑推理的实现[J]. 计算机学报,1990,13(1):32-41.
[17] 张乃孝. 三叉树结构及其实现[J]. 计算机研究与发展,1993,30(1):50-54.
[18] 张乃孝,蒋凌霄. ALL———算法与数据结构教学小语言[J]. 计算机科学,2003,30(11):178-180.
[19] 孙玉方,张乃孝. 实用C 语言程序设计[M]. 北京:北京大学出版社,1989;台湾儒林出版公司(繁体版),1992.
关键词:数据结构;教学改革;应用
中图分类号:TP311文献标识码:A 文章编号:1009-3044(2009)36-10155-02
The Teaching Reform and Exploration of the Course of Data Structure in High Vocational Education
WANG Yong-hong
(Jiangsu Animal Husbandry & Veterinary College,Taizhou 25300, China)
Abstract: Data structure is an important course, but it is difficult for students to learn it in high vocational education. Through the exploration of teaching reform, this text analyses the Data structure teaching contents and status of vocational education, proposes the idea that the character of vocational education decide application about Data StructureTeaching Reform.
Key words: Data Structures; Teaching Reform; application
《数据结构》是计算机应用技术、软件技术、网络技术等专业的重要专业基础课,是计算机科学的算法理论基础和软件设计的技术基础,也是我校计算机大类专业教学改革的重点课程之一。
《数据结构》研究的对象是数据之间的逻辑结构,以及如何把它们存储起来并便于访问和处理[1]。组织数据时,数据之间有四种逻辑结构(集合、线性结构、层次结构和网状结构)。存储数据时,也有四种存储结构(顺序结构、链接结构、索引结构和散列结构),它们的组合可以构成更复杂的存储结构[2-3]。对数据进行处理通常包括输入、输出、查找、更新、排序、插入和删除等运算。当数据的存储结构不同时,相应运算的实现算法也不同。
在高职《数据结构》教学改革中,如何更好地进行教学,取得好的教学效果,是我们一直探索的问题。
1 《数据结构》学习中的问题
1.1 高职的性质和特征
我们《数据结构》教学的对象是高职学生,而高职教育就是就业教育。计算机专业,如软件专业,其出口是符合企业岗位入门需求,具有相当于一年软件开发经验的软件开发工程师(资格证书)[4]。就业教育的特征是以就业为导向,以就业岗位的需求为基础,明确培养目标和教学的程度。以实用技能为核心,选择课程内容,学以致用。以动手能力为突破点,培养自学能力、解决问题能力。以项目经验为学习目标,了解行业规则。《数据结构》也应紧紧围绕这一特征展开教学。
1.2 《数据结构》教学的状况
从以往《数据结构》教学的情况看,效果没有完全达到,高职学生的来源、现状、特点,如学生理论应用能力欠缺,不能正确认识课程的作用,学习积极性不高等,影响了课程的教学[5]。在《数据结构》教学改革中,我们从课程本身入手,分析存在的问题,课程理论偏多,使得高职学生掌握困难,实践课程难度偏大,起不到应有作用,应用不具体,缺乏应用示例。我们提出,高职《数据结构》课程的改革不宜理论太抽象,而应重在应用。
2 《数据结构》教学改革重在应用
2.1 《数据结构》教学理解
数据结构是指数据间的相互关系。具体到计算机环境,一种结构自然地联系着作用在这种类型的数据上的运算,为了执行运算,必须把数据以某种方式存储在计算机中。因此,我们认为,数据结构就是由某种逻辑关系组织起来的一批数据,按一定的存储方法被存储于计算机中,并在这些数据上定义一个运算的集合[6]。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的存储结构。每种数据结构从逻辑结构、存储结构和操作运算等方面进行教学,全篇从集合、线性结构等基本数据结构入手,实现层次结构和网状结构等较复杂结构教学,这是《数据结构》教学的共同切入点[7]。
2.2 高职《数据结构》教学应发生变化
在《数据结构》教学改革中,我们研究认为,由于高职自身的特点和办学的现状,作为高职《数据结构》的教学,其内容和要求应有所变化,侧重点适当改变,理论的教学在内容和课时上应减少,课程的重点应转移到数据结构的应用上。最终的目的是学生应能够把基本的数据结构作为对象来看待,能够把常用的数据结构与面向对象的程序设计方法联系起来,进而掌握常用的线性表、堆栈、队列、二叉树、向量等数据结构及各种排序、查找算法应用[8],达到高职学生学了《数据结构》能够在系统开发中应用数据结构的目的。
具体地说,通过课程的教学,学生能够具备常用的基本数据结构主要算法的应用能力;具备常用的排序、检索和索引算法应用能力;具备在进行程序设计、调试、测试的课程项目训练过程中,能够合理地组织数据、有效地表示数据、有效地处理数据,书写的程序结构清楚、正确易读,提高程序设计的质量等能力[6]。
所以,教学重点也应随着相应改变为:基本数据结构在解决实际问题中的应用;基本的算法策略在解决实际问题的应用;新兴数据结构的相关问题;新兴算法的相关问题及实践;经典问题的经典算法;典型系统的计算机模拟;需自行设计数据结构和算法来解决的实际问题[9]。
算法描述语言采用广为程序员所使用的面向对象的语言,使得ADT (抽象数据类型)的概念得到更自然的体现,更本质地体现数据结构的思想,而且所定义的数据结构类能够方便地被重用[6]。
3 《数据结构》教学改革实践
以线性表为例阐述《数据结构》教学改革的思路。《数据结构》线性表在全篇中处于基础、入门的地位。我们在教学改革中,按照先讲清概念,再结合图像、动画理解逻辑结构和存储结构,重点讲解线性表的应用的方式进行教学,有意识地弱化理论性,强调动手能力的培养。讲解应用时,采用了Java语言作为描述语言,因为Java语言提供了许多预定义好的和已经实现的标准库,能够直接全面支持数据结构原理[10]。
在讲解线性表的概念时,通过举例,学生能够理解具有相同属性的数据元素的有限序列,逻辑结构通过示意图讲解也能接收。但线性表如何实现,就涉及到数据的存储结构,存储结构有顺序、链接、散列多种方式。我们讲解两种基本的存储结构。
在讲解存储结构时采用图像示意,加在其上的算法采用动画演示,但算法的具体代码描述已不再是重点。学生听懂后,重点转向数据结构的应用。就线性表而言,顺序表采用ArrayList类实现,链表采用LinkedList类实现。在Java语言中,与《数据结构》一样,ADT是一个仅保存数据类型和可能在这个数据类型上进行的操作定义。开发者只能通过ADT的操作方法来访问ADT的属性,无需知道ADT内部操作如何实现[11]。这就为我们《数据结构》教学改革的重在应用提供了可能性。
所以,线性表无论是采用何种存储结构,对外的接口总是不变。ArrayList类、LinkedList类都是List接口的实现。List接口中void add(int index,Object element)在指定位置index上添加元素element,Object remove(int index)删除指定位置上的元素,Object get(int index)返回List中指定位置的元素,int indexOf(Object o)返回第一个出现元素o的位置,如果没有该元素则返回-1,int size(),List subList(fromIndex, toIndex)等方法,ArrayList类、LinkedList类同样具有。LinkedList类增加特有的方法,如void addFirst(Object o),void addLast(Object o),Object getFirst( ),Object getLast( ),Object removeFirst( ),Object removeLast( )。
该处数据结构应用举例为模拟扑克发牌。采用ArrayList实现。首先生成52张扑克牌,然后用Collections.shuffle( )方法打乱牌的顺序,这个操作即模拟扑克洗牌操作,之后根据运行参数进行模拟扑克发牌。发牌方法dealHand(List deck,int n),参数n指明每人发牌张数。部分代码如下:
public static List dealHand(List deck,int n){//发牌
int deckSize=deck.size();
List handView=deck.subList(deckSize-n,deckSize);
List hand=new ArrayList(handView);
handView.clear();
return hand;
}
再通过调用main()方法来调用dealHand(deck,cardsPerHand)。
int numHands=4;//发牌人数
int cardsPerHand=11;//每人发牌张数
String[]suit=new String[]{"spades","hearts","diamonds","clubs"};//四种花式
String[]rank=new String[]{"Ace","1","2","3","4","5","6","7","8","9","10","Jack","Queen","King"};//13张牌
List deck=new ArrayList();//
for(int i=0;i
for(int j=0;j
deck.add(rank[j]+" of "+suit[i]);
Collections.shuffle(deck);//打乱牌的顺序,模拟洗牌操作
for(int i=0;i
System.out.println(dealHand(deck,cardsPerHand));//发牌
当我们将
for(int i=0;i
System.out.println(dealHand(deck,cardsPerHand));//发牌
增加在
Collections.shuffle(deck);//打乱牌的顺序,模拟洗牌操作
之前,可以对照洗牌前后的线性表的元素,顺序发生了变化,加强了对有序概念的理解。
这样的数据结构讲解,学生特别有兴趣,在不知不觉中,理解了数据结构的概念,学会了线性表的应用,达到了《数据结构》课程的教学目的。
4 结束语
《数据结构》课程是我校的精品课程,通过多年教学改革,我们做了许多有益的探索,学生通过共享教学改革的成果,对《数据结构》课程的学习收到了很好的效果。通过不断努力探索,我们将《数据结构》课程的教学从理论较重,改变为注重应用,走出一条适合高职学生的教学之路。
参考文献:
[1] 马秋菊.数据结构[M].北京:中国水利水电出版社,2006.
[2] 唐策善,黄刘生.数据结构[M].北京:高等教育出版社,2004.
[3] 严尉敏,吴伟民.数据结构[M].北京:清华大学出版社,2000.
[4] 全国高等院校计算机基础教育研究会[M].高职院校计算机教育经验汇编. 北京:中国铁道出版社,2007.
[5] 刘建国.高职《数据结构》课程教学方法改革探讨[J].北京市经济管理干部学院学报.2007.6:78-80.
[6] 张铭,等.数据结构课程的知识体系和教学实践[J].计算机教育.2004.3:89-91.
[7] 帅训波,等.数据结构间的纵横联系,计算机与信息技术[J].2007.8:39-41.
[8] 王志华,等.高等职业教育中《数据结构》课程建设研究[J].忻州师范学院学报.2007.4:59-61.
[9] 李治军,等.数据结构与算法课程设计教学模式的探讨[J].计算机教育.2006.2:54-57.
[关键词]数据结构;算法;数据元素;系统应用
中图分类号:TP311.52 文献标识码:A 文章编号:1009-914X(2017)22-0102-01
1 引言
随着计算机技术日新月异的发展,程序可视化教学在教育和教学中已经显示了明显的优越性。所谓可视化教学,是指在计算机软件与多媒体技术的帮助下,将一些抽象、深奥、复杂的事物以及发展过程,用仿真化、虚拟化、实体化的方式,在教学方法中显现出来。可视化教学应用方便,可以使计算机学习者直观地观察、体验并利用这些可视化的知识模型,从而使计算机学习者较为轻松地进行课程的学习,对计算机学习者的认知能力与创新能力都会有较大的提升。
可视化教学应用于数据结构算法教学当中,可以改变传统教学方法中的枯燥乏味局面,吸引计算机学习者的注意力。可以将文字、数据、图片、源代码等其它多媒体动态地融合在一起,丰富算法的执行过程。可以让计算机学习者体会在大量不同的数据结构下,算法执行效率的差异。计算机学习者也可以充分的利用自己的课余时间进行自我学习,通过可视化教学软件研究算法的执行过程,培养计算机学习者自主学习的能力。
2 数据结构与算法系统的需求分析
传统的数据结构与算法教学方法中,有些算法的执行过程比较抽象,教师为了讲解一个算法往往需要辅助大量的图形示例。常规的板书和一般的幻灯投影授课均难以有效地展示这种抽象性和动态性,容易造成教学的低效和学时膨胀。有一些学校看到了弊端,苑⒊隽耸据结构教学网站供计算机学习者学习和交流;也有一些学校则开发出了可视化数据结构教学演示系统,将数据结构中算法的执行过程直观展示在用户面前。整体上看,这些系统在一定程度上促进了用户的学习,但还存在着一些不足,如系统以“教”为中心而设计,缺乏以用户为中心的人机交互理论的指导,学习者与软件的交互机会少且单一。因此,一个供用户自主设计算法,在实践环节上进行创新,提出自己的见解和设计,并得以验证,从根本上和底层次上深化对数据结构与算法的理解的学习平台的苑⒂任重要,互联网支撑的数据结构与算法学习系统将解决这个问题。系统能够让用户熟悉数据结构课程的核心理念,掌握相关算法内部的运行机制。本文在研究数据结构模块的基础上,将开发一个数据结构与算法学习系统,联动演绎各数据结构模块是如何有机结合的,并为用户提供自主设计算法的接口,这也是本系统区别于其他系统的一个创新点。
本文提出的数据结构与算法学习系统的设计目标为:系统良好的交互界面,包含数据结构各功能模块的算法演示,各模块详细信息查看,利用计算机图形界面技术,提供良好的用户界面。系统实现一系列数据结构的算法,用户能实时查看算法图形动态演示过程,并提供各算法和数据结构的详细中间结果信息,帮助用户进一步理解算法的执行过程和效率。系统不仅可以为用户展示数据结构算法的执行过程和中间结果,还提供编程接口让用户实现自定义算法,并对该算法进行测评,以图形界面的方式展示在用户面前。系统具备良好的稳定性,采用了多种安全机制确保服务器的稳定运行,保证了系统的安全可靠。充分运用面向对象的设计思想来设计系统模块,使其具有良好的扩展性,方便系统的后期维护和扩展。
3 数据结构的系统总体架构
系统采用典型的三层架构作为开发模型,本系统的三层架构主要划分为客户端、服务器端和服务资源层。系统客户端是一个浏览器,显示用户的使用界面,不同的用户通过浏览器向服务器端发送请求,然后接收服务器的返回信息展示在用户界面上。服务器层位于系统的服务器端,包含了数据库服务器和应用程序服务器,它提供了数据支持,实现了算法引擎和代码测评,算法引擎提供了经典算法的演示和用户自定义算法演示,代码测评负责对用户提交的源代码进行测试,并生成y试数据。服务资源层位于系统的服务器,它提供用户经典算法库和可视化类库,经典算法库包含了相关的代码以及算法演示的全过程,可视化类库提供用户的一些画图操作,让图形界面的演示更为美观。
优秀的系统必须能够满足系统的扩展和维护需求,数据结构与算法学习系统三层架构侧重于设计的简单化,简化客户端的功能,将复杂操作置于服务器端。系统的客户端,也就是浏览器层,仅仅用来显示用户工作界面和执行一些画图操作。系统的客户端是前台用户浏览器,显然,浏览器不会对测评系统产生任何影响,只要客户端浏览器支持环境就可以运行该系统,而目前的浏览器都对其进行了支持。不管客户端有多少不同种类和数目,都不会影响系统的完善和后期维护,这样就减轻了系统开发和扩展维护的难度。另一方面,系统服务器端承载了绝大多数的负载,基于此情况,服务器端的配置就必须要合理,后台服务器的一个小小的错误都有可能对系统测试服务造成不可预计的影响,因此,保证系统服务器端的安全稳定运行是十分关键的。
在本系统的三层架构中,利用基于面向对象的方法进行系统的苑,按照系统需求对服务器做了不同模块的划分,主要分为三个部分。分别是数据库、算法引擎和代码测评程序。数据库为用户提供数据支持,能够满足用户对数据的增加、修改、删除、更新等操作。算法引擎负责对算法进行解释,给用户提供算法的演示功能,并能够将用户按照系统要求编写的代码转变成图形方式展示在用户面前。代码测评程序主要对用户提交的源代码进行完整的测评,其中包括源代码编译,源代码测试和程序监控等。对于服务资源层,包括两大部分,分别是经典算法库和可视化类库。经典算法库包含了数据结构九大章节的数据结构模型和相关的算法,供算法引擎调用,在客户端上展示出来。可视化类库提供了一系列的数据结构画图操作,使算法的演示过程显得生动形象。
服务器层用分离可缩放结构,算法引擎部分与代码测评程序两者没有直接交互。本文设计的系统将算法引擎与代码测评分离开来,测评模块用多线程处理机制,极大的提高了系统的响应速度,双方通过数据库进行~合。这种结构的设计也使得测评模块的复杂性有所降低,首先,测评模块易于维护,不同模块的修改不会对其他的模块造成影响,其次,利于系统的负载均衡。如果算法引擎和代码测评在同一台服务器运行,当同时测试的用户比较多的时候,非常消耗服务器资源,容易照成服务器负载过重。用了分离可缩放结构,代码测评系统就可以单独的放在另外一台服务器上,专门负责源代码的测评工作,甚至可以放在一个集群上,有效地提升系统的运行效率。通过对系统进行分层,能够使得系统的各大模块之间没有强的Q合,彼此之间相互联系却不会相关干扰,使得开发过程方便快捷,对以后的维护和扩展也有着极大的好处。
参考文献
[1] 在线学习系统的设计与开发[J].李萍.电子世界.2013(13).
关键词:数据结构;理论教学;实践教学;教学改革
中图分类号:TP311.12-4 文献标识码:A 文章编号:1007-9599 (2012) 17-0000-02
1 课程内容
《数据结构》是计算机科学中一门综合性的专业基础课,也是其它辅修计算机专业的必修课程。本课程讨论了软件设计中经常遇到的线性表、堆栈、队列、串、数组、树和二叉树、图等典型数据结构的逻辑结构、存储结构和操作的实现方法,以及递归算法设计方法和各种典型排序和查找算法的设计方法。并对算法进行性能分析和比较,内容非常丰富。数据结构课程是一门理论和实践相结合的课程。本课程包括讲授和课内上机实验两部分教学内容。课内上机实验是为训练学生的实际程序设计能力安排的。
课程的目标是使学生掌握数据基本的逻辑结构和存储结构、一些典型的数据结构算法及程序设计方法和技巧,要求学会分析数据对象特征,掌握数据组织方法和计算机的表示方法,为数据选择适当的逻辑结构、存储结构以及相应的处理算法,要求具备算法分析的基本技术和能力,并培养良好的程序设计风格,掌握开发复杂、高效程序的技能。
2 理论教学方法与手段的探索
遵循以学生为主体,以教师为主导的教育理念,针对理论教学和实践教学的不同特点,合理进行教学设计,推进教学方法和教学手段改革。课堂上引入启发式教学,充分发挥学生的学习主动性,重视自学能力的培养,引导学生积极思考,活跃课堂气氛,适当压缩授课时数, 留给学生更多的思维空间和自学空间,增加学生阅读参考书、科技文献和写读书报告的时间。数据结构的教学策略:
(1)激发学生的学习兴趣
兴趣是最好的老师,只有激发了学生的学习兴趣,才能事半功倍,取得更好的学习效果。在教学中通过具体的实例说明数据结构在程序设计中的重要性,从而激发学生的求知欲,让学生充分感受到数据结构算法设计的魅力,调动学生思考的积极性。鼓励学生对教学内容提出疑问,师生共同讨论,从而提高教学和学习水平。在课堂上随时提出一些思考题,对一个结构从不同角度讨论。例如,对于线性结构,讨论线性表、栈和队列各自的操作特点。鼓励学生在学习过程独立思索,提出不同的算法,深化对问题的理解。例如在讲解循环队列时,如何判断队空和队满,有的同学提出三种解决方法。对于这样的同学,我们及时给与表扬和鼓励。
(2)教学内容的有机组合
在现有教学大纲的内容的基础上,不断吸收新知识、新内容,补充考研试题。对教学内容的安排重新进行拆分和重组,突出重点、细化难点。运用面向对象的学习方法讲解数据结构,每一种数据结构的学习方法都是相似的,重点介绍数据结构的逻辑关系、基本操作和在不同存储方式下基本操作的实现,介绍数据的逻辑结构和物理存储之间的关系,及物理存储在类C语言中的描述,数据结构的主要内容可用以下的体系结构来表示。
学生在了解了数据结构课程的核心内容后,算法的实现就不难理解了。例如:我们在讲授线性表的复杂操作有序表的合并时,先从逻辑上看是如何实现的,介绍算法设计思想,然后讲解两种实现算法:顺序存储方式和链式存储方式下的算法,让学生自己比较两种算法,加深理解。
(3)双向互动式的教学
改变原来“填鸭式”的教学模式,变以教师为主的教学方式为以学生为中心的教学模式,教师只起画龙点睛的作用。课堂上引入启发式教学,充分发挥学生的学习主动性,重视自学能力的培养,引导学生积极思考,活跃课堂气氛,适当压缩授课时数,留给学生更多的思维空间和自学空间,增加学生阅读参考书、科技文献和写读书报告的时间。为了更方便和鼓励学生自主学习,我们建设了数据结构精品课程网站,有授课视频、教学课件、各章习题和考研辅导等学生内容,教师还可以通过网站进行网上答疑,与学生及时交流。
(4)注重各知识点的有机统一
若想让学生做到融会贯通,举一反三,在教学中就必须注重各知识点的有机统一。比如在讲授内部排序算法时,综合比较各种排序算法的时间复杂度、空间复杂度、稳定性、最好及最差情况等。让学生通过比较,提高解决问题的能力,会根据不同形式的待排序表选择合适的存储方式和排序方法。再就是讲授链队列时,讲完用一个带有头尾指针的单链表表示的队列后,再让学生思考如何用一个循环链表表示队列,在给出启示后让学生自己写成队列的初始化、入队和出队算法,通过这种方式的教学不仅培养了学生的思维能力,而且有助于培养学生的创新能力,会综合运用所学知识,用计算机解决较复杂的问题。
(5)运用现代化教学手段
重视现代教育方法、技术手段的运用,采用多媒体教学,加大课程信息量,提高教学效率。在采用多媒体技术讲授本门课程的过程中,在深入研究多媒体教学的特点以及学生现有知识架构的基础上,重新组织、优化、补充教材内容,精心制作多媒体课件。在多媒体课堂上,通过教师有机地组织电子教案、演示课件等,使得学生能形象地领悟到算法的效果,教学变得丰富、有趣。在授课过程中,首先还原问题的本来面目——提出问题,引导同学积极参与——尝试解决问题,在讨论的基础上给出结论——讲授教学内容,最后采用课件进行算法的动态演示,加大了课堂信息量,提高了教学效率。
3 实践教学的探索
实践教学是数据结构课程教学的一个重要组成部分,对本门课程的学习起着至关重要的决定。通过实践教学,让学生能够学会运用书上学到的知识来解决实际问题,培养软件工作所需要的动手能力。
实践活动通过两个环节来实现,第一个环节课程实验,较偏重于对课程内容的理解。实验讲义完备,开出率100%。保证了学生理解和掌握课程的基本理论和基本概念,又提高他们的动手能力。第二个环节课程设计实习,让学生有机会自己提出实验项目、实验方案,在教师指导下按其方案进行实验,最后让学生自己得出应有的结论,进一步培养学生的学习兴趣和实践动手能力,从而激发创造力,也初步实现了对学生进行一整套软件工作规范的训练和科学作风的培养。
(1)实验教学内容
依据实验教学大纲,合理安排实验教学内容。我在教学时把实验项目按照不同内容和难度分成三种类型:基础型实验项目、设计性实验项目、和综合性和创新型实验项目,实现了实验教学内容的创新。基础型实验项目安排在各个章节中,主要围绕数据结构基础知识内容,目的是让学生掌握各种基本数据结构的逻辑关系和存储方式,通过实验验证算法,理解数据结构的基本操作的定义和实现。设计型实验项目是在基础型实验项目的基础上,让学生自己设计数据结构和算法,提高学生解决问题的能力和良好的编程能力。例如一元多项式求和,要求学生选择合适的数据结构自己编写算法。综合型实验项目涉及数据结构中多个知识点的重点内容,要求学生自己进行设计和实现,主要训练学生综合运用知识的能力,协作能力和创新实践能力。
(2)考核方式探索
为了培养学生的创新意识和团队协作精神,促进学生之间的交流和协作,使不同水平的学生都能在大型实验项目中担负起相应的工作,特别设计了一套针对综合型实验和探索创新型实验的考核方式和考核方法。
根据不同的实验项目采取不同的考核方式,基础型和设计型实验项目安排在平时每周的上机实验课进行,根据学生提交的实验报告进行考核。综合型和创新型实验项目较大,需要学生分工合作,共同完成,一般对学生进行分组,每组完成一个实验项目,在课程设计环节完成,一般有两周时间,教师根据每个学生在组内的表现给出一个考核成绩,项目完成后,再根据各组提交的项目报告和项目的质量给出合理考核成绩。这样既激发了学生的创新能力,又提高了学生的团队合作精神。
4 结论
在研究课程的教学方法时,要因内容制宜,因学生制宜,采取不同的教学方法。本人通过近十年对数据结构教学的实践与探索,取得了一定的教学效果,使得学生在学习数据结构时,不在感觉那么抽象,理解数据结构和算法不再那么困难,让学生真正理解了数据结构的作用,会选择和使用合适的数据结构解决问题。为学生后继课程的学习打下良好的基础,乃至对学生今后从事软件方面的工作都会提供较大的帮助。
参考文献:
[1]严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社,2002.
[2]李治军,廖明宏,张岩.数据结构与算法课程设计教学模式的探讨[J].计算机教育,2006(2).
[3]殷人昆,陶永雷,谢若阳,盛绚华.数据结构(用面向对象方法与C++描述)[M].北京:清华大学出版社,2002.
[4]李锋,孙莉.任务驱动式方法在离散数学教学中的应用[J].计算机教育,2006(3).
[5]王锐.基于网络的《数据结构》新型教学模式研究[J].中州大学学报,2006(10).
[6]莫家庆.《数据结构》程序教学模式探索[J].计算机教育,2008(9).