时间:2023-03-15 14:56:14
引言:寻求写作上的突破?我们特意为您精选了4篇数据结构与算法范文,希望这些范文能够成为您写作时的参考,帮助您的文章更加丰富和深入。
作者简介:李永(1978-),男,安徽宿州人,盐城师范学院信息科学与技术学院,讲师。(江苏 盐城 224002)
中图分类号:G642.0?????文献标识码:A?????文章编号:1007-0079(2012)31-0057-02
“算法与数据结构”主要研究数据在计算机中的表示方法、存储方法以及其上的操作。[1]在美国IEEE/ACM课程体系和我国教育部学科规范中,[2,3]“算法与数据结构”被列为核心课程之一。它是操作系统、数据库、软件工程和人工智能等课程的基础。算法与数据结构蕴含的思想对学生在软件设计方面有很强的导向性,它的教学效果直接影响学生的数据抽象和程序设计能力的培养。学习该课程,一方面,使学生学会分析数据对象的特征,掌握数据组织的方法和在计算机中的表示方法,为数据选择合适的逻辑结构、存储结构和算法;另一方面,培养学生良好的程序设计风格,进行复杂程序设计的训练。[1]
为了在课时约束、学生基础、课程难度、教学目标等约束下最大化教学质量,使学生最大限度地得到提升和发展,本文从分析“算法与数据结构”课程存在的问题出发,在教学内容、教学方法、实验教学等方面进行了一些探索和实践。
一、“算法与数据结构”教学中存在的问题
1.课程本身难度大
“算法与数据结构”是抽象与具体的统一,理解与掌握它需要跨越横亘在抽象与具体之间的鸿沟。学习该课程有两个难点:一是从算法与数据结构到程序实现的跨越;二是从实际应用到数据结构抽象的跨越,即如何利用算法与数据结构解决实际问题。[4]“算法与数据结构”的内容抽象、繁多、逻辑性强,难于理解掌握。学生学完后不知道学了什么,当需要解决实际问题时感到无从下手。“算法与数据结构”综合性、技巧性强,各种算法中凝结了大量杰出计算机科学家的智慧,在有限的教学时间内部分学生因无法领悟其中的思想与精髓而产生厌学情绪。
2.前导课程基础不扎实
“C语言程序设计”、“高等数学”、“离散数学”等是数据结构的前导课程,其中“C语言”与“数据结构”课程的联系最为密切。“C语言”一般开设在大一第一学期,是学生最先接触的程序设计语言。由于内容多、难度较大、大班教学、课时有限等原因,教学时间大部分花在基本概念及简单程序的编写上,对结构体、指针、参数传递等难度较大的知识点讲解不深入,为“算法与数据结构”的学习埋下了隐患。
3.教学方法有待改进
“算法与数据结构”的教学方法主要为板书结合PPT课件,教学方式采用“教师讲—学生听”的灌输式授课模式,与学生互动少,课堂气氛沉闷。教学方法中以教师为中心按照教学大纲教学,存在照本宣科、就事论事、内容堆砌、缺乏新意等缺点。由于没有考虑学生的接受能力、思维能力以及编写代码的能力,学生只是不加思考地被动的接受知识,限制了学生的积极性与主动性的发挥。
4.实验教学中存在的问题
目前课程实验中存在的问题主要有下面三个方面。首先,大多高校“算法与数据结构”实验的教学方式仍是以教师为中心,以灌输、模拟、验证为主;教师按教材单元布置实验任务并做适当的引导和提示,然后学生动手实践。没有考虑实验的实用性以及是否适合学生,不能调动学生的学习热情。其次,学生的程序设计能力普遍较弱,面对问题时难以有清晰的算法思想,无法将算法思想转变为正确的程序代码,上机调试和运行程序时面对众多的错误提示无法正确解决,实验课教学效果大打折扣。再次,由于实验课时有限,且实验内容具有相互依赖和递进的特点,部分学生又不能充分利用课余时间,造成问题堆积。
二、“算法与数据结构”的教学探索
1.合理组织教学内容
贯穿“算法与数据结构”课程的主线是逻辑结构、存储结构及操作,即线性表、树、图三种逻辑结构;顺序和链式两种存储结构;插入、删除、查找、遍历等操作。这些内容不是孤立的,在教学过程中将它们联系起来形成一条主线,由线性到非线性,由简单到复杂,方便学生理解和掌握。在教授课本内容时,根据教学大纲的要求梳理并提炼出各章节的知识框架,根据学生情况和教学目的合理划分课时,控制课程节奏。课堂上主要针对程度一般的多数学生从数据结构的逻辑结构、存储结构和数据的运算三个方面去组织教学内容,做到重点突出、内容简洁。对于程度差的学生进行个别辅导,通过补习和细化教学内容帮助其跟上教学进度。对于程度较好的学生,通过指定课外读物、布置思考题等,让其能力得到充分发挥。
2.上好第一节课,激发学习热情
1背景
数据结构与算法是计算机类专业的一门核心基础课程,是计算机、软件工程等电子信息类专业的必修课。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法;介绍了常用的多种查找和排序技术,并对其进行性能分析和比较,内容非常丰富[1-2]。本课程的教学目标是加强学生对数据逻辑关系的分析与认识,培养学生数据抽象的能力,通过理论分析与编程实践相结合,增强学生求解复杂问题的能力以及控制算法复杂性的能力。
在计算机科学中,数据结构不仅是程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统等系统程序和各种大型应用程序的重要基础[3]。数据结构与算法是计算机类专业部分专业课的先导课,如操作系统、编译原理和数据库原理等,因此它为后续的专业课程学习提供必要的知识和技能储备[4]。数据结构与算法课程一直以来都是本学科的核心专业基础课程,而且正逐渐发展成为众多理工科专业的热门选修课。只有学好了这门课,才能在今后的计算机专业课程的学习中游刃有余。因此,本课程在国内同类课程中有较明显的先进性和示范性。
根据新世纪对人才培养的要求,教学应重在学生能力、素质的培养,尤其是思维能力、实践能力、创新能力的培养。多年来我们致力于数据结构核心课程的建设,从完善课程体系、加强团队建设、深入教学改革和丰富教学资源等各个环节不断探索和实践。从提高学生的学习兴趣和加强实践环节教学方面入手,在教育教学方面持续、深入地改进教学方法,开展教学研究,提高教学质量。
2完善课程体系
首先,完善以“扎实基础,强化实践,引导创新”为培养目标的课程体系。计算机类专业核心基础课程体系主要由离散数学、面向对象的程序设计、数据结构与算法、操作系统、编译原理、计算机组成与结构、数据库原理7门课程组成,用于支撑计算机科学与技术、软件工程、网络工程、信息安全、数字媒体技术5个计算机科学相关专业的教学。
我们将课程群的理念引入计算机专业基础类课程教学,建立了以数据结构为核心的计算机类基础课程群,如图1所示。课程群以培养综合运用计算机基础知识能力为目标,打破课程间的壁垒,强化课程联系。本课程群以数据结构为核心,将数据结构的一些基本内容如链表、排序等渗透到“C/C++程序设计”课程中;将编译原理、数据库原理等需要使用数据结构内容的部分在数据结构课程中以应用的实例进行讲解,从而将相关课程的授课内容形成统一的整体。
在实践环节我们强化数据结构对程序设计语言的训练及解决相关课程问题的训练。除各门课程有单独的实践课程外,独立设置贯彻整个教学环节的实践课程,将数据结构课程群中各门课程较为关联的综合大作业进行归并整合。自身实验课程注重双基训练,但大实践课程要求对整个数据结构课程群教学经验丰富、能够精确把握该课程体系要点的教师进行授课,在教学中能够结合本学期相关课程设置大作业,在讲授中能够根据学生的具体情况进行诱导性教学,使学生通过完成大作业来更深刻地认识学科体系的全貌,强化学科综合素质的培养。
以数据结构课程为中心构建计算机类专业的核心基础课程体系,将与计算机科学相关专业的专业基础课程教学打通,在课程、课件、教材、师资队伍等多方面进行统一的规划和建设,以不同的着重点组织课程教学内容、进行大学生计算机实践能力和创新能力的培养。该体系打破了原有实验教学附属于理论课程的模式,理论教学与实验教学既相对独立、又相互联系,改变了单一的知识验证的实验模式,增强综合应用设计和创新实践内容,全面提高学生的实验实践技能。“扎实基础,强化实践,引导创新”培养目标体现了当前计算机类专业教育的发展趋势,走在国内高校的前面,在全国各类会议作专题报告近30次。
3加强团队建设
目前我院数据结构与算法教学团队共有5位主讲教师,其中教授2人,每50名学生配一名助教(博士或工学硕士)。该教学团队主要由30~40岁的年轻教师组成,尽管精力充沛,工作热情很高,但教学经验尚有欠缺。团队建设是本课程建设的重中之重,要把提高教师的综合素质和教学科研水平,强化教师的责任心放在首位。坚持教学与科研相结合,以国家自然科学基金项目为依托,为提高教学质量,不断提高科研水平和能力;以国家特色专业建设项目为依托,加强教学研究,以理论指导教学实践,吸取好的教学方法和经验,不断改进教学方法和手段,迅速促进教学团队成长。
在青年教师培养方面注重教学和科研能力的同步培养。要求青年教师在首次上课之前听课助课,培养基本教学能力;实行集中备课,统一课件,互相监督,保持教学一致性和教学内容一致性;定期召开教学研讨,及时总结教学经验方法,教授言传身教;以特色专业建设项目为依托,鼓励青年教师开展教学研究,以国家级项目为依托开展科研课题研究。青年教师成长迅速,已具备一定的科研能力,教学效果良好,学生满意超过90%;获得校教学质量优良奖,青年教师讲课竞赛二等奖,多媒体课件二等奖等多项奖励,已经成为学院的业务骨干。
4深化教学改革
4.1不断探索新的教学模式
1) 实践性教学。
实践是获得真知的根本源泉,主动探索真知是研究型人才的基本素质,我们在基础课中的创新能力培养主要体现在,让学生在自由的实验环境中积极实践、主动探索,自己发现新的知识和理论。如图2所示,在实践环节建设方面,建立书面作业,上机作业和课程设计3个层次的实践教学环节,以通过书面作业形式消化理解教学内容;通过上机作业培养动手能力,将课程单元知识转化为实际技能;通过课程设计培养解决实际问题的能力,融会贯通本课程的知识。
为了满足强化实践的教学要求,本课程团队经过多年实践,精选、整理了包括卡内基梅隆大学、斯坦福大学、麻省理工学院等国内外著名大学教授布置的实践作业,结合我们的教学要求,每学期给学生布置18道有一定创新性的上机题目。这些题目既反应了数据结构教学的基本知识,又来源于实际应用。达到了理论和实践的完美结合。本课程实践教学和理论教学环节的学时比例为1.5∶1。经我们多年实践,这个比例符合我国高等教育实际,达到了良好的能力锻炼目的,值得推广和借鉴。
2) 研究型教学。
在研究性理论教学方面,以教学大纲为主线,整理数据结构领域的经典论文,以提出问题为课堂教学的第一步骤,引导学生思考,将科学家的研究方法和研究思路融入课堂教学中。依托科学研究项目,提出本学科领域的最前沿课题,鼓励学生思考并解决。对有明显创造性的成果可以在教师指导下撰写学术论文。
将研究型教学融入数据结构实践教学课堂,鼓励学生从解决问题的角度研究如何设计数据结构与算法,在传授基础知识的同时注重创新性思维方式的培养,发现问题和解决问题能力的培养。
4.2全方位的课程改革
课程建设的核心是提高教学质量。为提高教学质量,我们从教学内容、教材、教学方法和手段、考试方法、实践教学等方向进行了全方位的改革。
1) 教学内容改革。
课程组参考国内外其他院校本课程的教学大纲和优秀教材,对数据结构课程的教学大纲进行了多次修订,逐步稳定了理论教学的教学内容、教学要求,细化了教学目标,明确了教学任务、教学内容、教学重点和难点、不同知识点的掌握程度。理论教学采用以共性化课堂教学为主,并利用辅导答疑和实践教学组织以学生为主的个性化教学,培养学生创新能力,辅助课堂教学。在教学过程中采用启发式教学方式,即注重学生基础理论知识的掌握,也注重学生分析问题、解决问题等基本能力的培养。
为了配合理论教学,我们也多次修订了实验大纲,使实践内容更加符合专业的发展和其他各方面的要求,并且与前序课程和后继课程很好地衔接。在实践环节中注重学生能力的培养和科学的开发方法的培养。实践教学内容采用梯度组织,具有不同的难易程度,方便学生巩固学习和拓展知识。
2) 教材选取。
目前本课程使用教材为高等教育出版社出版的《数据结构与算法》,许卓群、杨冬青等编著。该教材除了讲授基本数据结构外,突出作为面向对象程序设计的基础概念――抽象数据类型,强调算法与数据结构的密不可分性、封装性等;在处理知识面的宽度和知识点的深度上,既满足作为基础课的要求又达到一定的水平,完全适合本专业对人才培养的要求,是普通高等教育“十五”国家级规划教材。目前课程组已经开始着手准备根据我们自己的教学特点、专业要求等实际情况自主编制一套教材。
3) 教学方法改革。
(1) 启发式教学:学生的主动性是学习,我们在教学过程中注重启发学生的思维,采用循循善诱的方式引导学生自己发现问题,并逐步解决问题,培养学生思考问题、分析问题和解决问题的能力。这极大调动了学生的主观能动性,培养了学生分析和解决问题的能力。
(2) 共性化与个性化相结合教学:从教学形式上,我们积极探索新的教学方法,以便能够调动和发挥学生的主观能动性。具体有以教师为主体的课堂教学、习题课等共性化教学环节,也设置了答疑p质疑等教学环节,引导鼓励学生通过实践和自学获取知识。共性化与个性化相结合,既可以起到教师主导作用,也可以满足学生个性学习的需求。
(3) 理论与实验相结合:数据结构课程主要介绍数据的逻辑结构、物理结构以及算法。算法的思想需要通过一种程序设计语言加以描述并在计算机上实现。我们在重视理论教学的同时,也很注重实验课,注重学生灵活应用知识能力的培养。理论与实验相结合,可以使学生更好地理解“数据结构”的思想与概念。
5丰富教学资源
建立本课程网上课堂及在线智能教学系统。网上课堂设计的目的是能够给不同层次、不同需要的学生提供帮助,提高教学质量。根据网络教学环境的要求,
系统主要包括课程概况、师资队伍、教学资源、实验指导、教学录像、课程扩展、课程论坛等多个模块。系统主要具有以下特点:
1) 在线学习。
知识内容结构化,主体结构采用网页形式组织教学内容,以单元、章、节等知识点为中心组织教学,以关键词或标题为线索进行任意的查找。各知识点在整体上搭建框架式结构,思路明晰;在细节上环环相扣,前后关联紧密,便于学生更好地理解和掌握知识要点。
2) 动画演示。
以数据结构部分的讲授为例,这部分内容包含许多的算法,其描述大多数采用类高级语言的形式进行,有些算法无论是时间复杂性或是空间复杂性都比较高,采用动画的形式将算法的执行过程和思想呈现给学生,使学生很容易理解这一过程,再配上教师的解释做旁白,可产生与上机亲身实践和跟踪执行相似的效果。
3) 在线测试。
用数据库对练习题和模拟题进行有效的管理,在学生进入到考核子系统后,能交互式进行试题的选题与答题。当学生提交答卷后,系统又能对答分进行自动评判,并给出相应正确的答案和综合得分。
4) 课程扩展。
为更好地促进教学,本课程在巩固基础知识,提高实践能力的基础上,对学有余力的同学扩展了本课程的内容。引入了卡内基梅隆数据结构教学网站,这是一套全英文系统,上面提供了丰富的工程性题目训练,更加注重数据结构算法在实际中的应用,让学生开阔了思维和眼界;还为学生提供了ACM竞赛以及大连理工大学程序设计竞赛的模拟题库,通过这些略有难度又很新颖的题目进一步提高学生的学习兴趣,培养其解决实际问题的能力。
6结论
在近几年的课程建设实践中,我们的任课教师认真组织教学内容,与实际相结合,积极探索有效的教学方法,利用多媒体技术动态演示复杂数据结构的变化,并补充学生比较感兴趣的知识,拓宽学生的知识面。逐步完善和充实现有课件,做到内容充实,画面生动,具备声像效果,收到了很好的教学效果。作为计算机科学的核心内容,数据结构与算法的理论研究及应用研究一直在不断发展,在以后的工作中要注重研究型教学,鼓励学生从解决问题的角度研究如何设计数据结构与算法,并将学科领域经典研究成果和最新研究成果及时地反应在课程教学中,相信数据结构与算法这门课的教学效果和教学质量在我们持续深入的教学改革中会越来越好。
注:本文受教育部第二类特色专业建设项目――软件工程特色专业建设项目资助。
参考文献:
[1] 严蔚敏,吴伟民. 数据结构[M]. 北京:清华大学出版社,2002.
[2] 殷人昆. 数据结构(用面向对象和C++描述)[M]. 北京:清华大学出版社,2007.
[3] 殷人昆,邓俊辉. 清华大学“数据结构”精品课程建设[J]. 计算机教育,2006(5):20-22.
[4] 钱红兵,唐发根. “算法与数据结构”课程教学体系的建设[J]. 计算机教育,2009(17):65-66.
Development of the Data Structure and Algorithm Core Course
LIU Xinyue, ZHANG Xianchao, YU Hong
关键词: 公交;数据结构;算法;实现
Key words: bus;data structure;algorithm;implementation
中图分类号:TP301.6 文献标识码:A 文章编号:1006-4311(2014)19-0202-02
0 引言
目前,公共交通是人们出行最常用的一种方式,本文意在对公交数据结构算法与实现问题进行相关分析,使人们出行可享受便利的公交服务。基于对具体公交实际情况的研究,笔者对公交数据结构的算法进行了人性化的修改,使其实用程度大大提高,以不断满足大多数人的出行习惯和要求。
1 以GIS为基础的公交数据结构模型
GIS就是一种地理信息系统,它主要是用于搜集、模拟、加工、检索、分析以及表达地理空间数据的计算机数据信息系统。它以点、线、面三种不同的基底数据模型表达为主。因此,我们可以通过计算机建立起城市公交网络模型,利用GIS点模型来显示公交车站的具体数据信息,进而用这些数据结构来表示公交线路的路径信息。
经过比较,我们发现一个城市的公交网络要比其道路网络复杂许多,它不但包括公交站点与公交路线的数据结构,而且还有许多其他的数据信息。我们可以从图1公交网络模型的结构图来了解部分相关数据结构。
首先,公交站点数据。
这里的公交站点是指城市公交网络体系中的所有公交站点,在这里,我们可以借助于点模型来具体描述它们的地理位置,最后把它们站点名称等信息储存在属性数据之中。
其次,公交线路数据。
据调查,每一条公交线路都有自己对应的唯一编号。这一编号包含多种信息,主要有该公交线路的名称、起点、终点、上班、下班时间等具体信息,这些信息都记录在属性数据中。
其三,公交段数据。
公交段数据主要指城市公交线路的路径信息。我们可以利用线模型来描述其具体的地理位置。
其四,线路与站点关联数据。
各个线路与站点的辨别以及相关信息都是通过关联数据来体现的,这些数据都是按照顺序从始至终来记录的,清楚并相互对应的描述了公交线路的每个站点。
其五,站点与线路关联数据。
站点与线路关联数据是用来记录站点所经过的公交线路信息的,并以此来记录站点与线路的关联信息。
公交网络模型,它的数据结构不单单含有丰富的公交信息,还明确了每一个公交实体相互间的关系具体是怎样。在公交段表中所介绍的公交站点和公交段之间的空间拓扑关系,其实就是每个公交段记录一个前结点和后结点,实际上也是这个公交段的起始站点和终止站点的一个记录。其次,每张表中的数据前后要保持一致,比如:站点-线路关联中的线路ID必须跟公交线路的LineID保持一致,而它们之间的数据结构关联关系见图2具体表述。
2 公交数据结构算法与实现的思路
在实际的生活中,公交数据不是固定不变的,它往往受到多种因素的影响,因此在公交数据结构算法与实现的过程中我们要充分考虑这一问题,努力合理实现公交数据结构的计算和应用。
2.1 影响公交数据结构算法与实现的因素
影响公交数据结构算法与实现的因素有多个,主要有以下几个:首先,出行距离。这主要包括两种,即车上距离和车外距离。车外距离就是指乘车者为了乘坐公车而步行的那段距离;其次,换乘次数。这是指乘车者为到达目的地在乘车的过程中所换乘公交车的次数;其三,出行时间。这是指乘车者在一次出行过程中所需总的时间,这既包括在车上的时间也包括为乘车花费的车外时间;其四,出行费用。这是指乘车者在完成一次出行过程中所花的车费。由于不同的乘客对于这些因素的要求不一样,他们优先考虑的因素不同,这就导致公交数据及其结构的变化。本文笔者经过研究提出了全面的公交数据结构模型,并给出了对应的计算方法。
2.2 人性化的公交数据结构算法与实现
而公交数据结构算法与实现在实际的运用中要本着人性化的要求,因此在这一算法的过程中,我们要着实考虑多种不同的优先策略,例如尽量减少乘客的换乘次、费用最少化、时间和距离最短化、道路最优化等等。不同的人对公交乘坐路线的选择也是会有不同的,因此乘车方案要结合具体的实际情况进行考虑,有的人会把时间因素看的重要些,有的人会率先考虑费用问题,总而言之,其实就是对公交网络模型中的权值的衡量。
本文经过实践和调查提出了一种基于换乘次数最少的公交数据结构算法,这一计算方法相对其他方法来说比较符合人们出行时的心理状况。这一计算方法的思想我们可以描述如下:
根据大多数人的习惯我们可以得出,在出行选择路线时,2站之间首先考虑的是直达车,如果只有一条则选择该方案,若有多条则根据花费时间,花费费用等因素进行选择。如果没有直达车,则要考虑换乘,换乘时首先考虑经过2站的车辆是否有共同的站点,如果有,则可以在此站进行换乘,如果没有则要考虑进行2次换乘,即在2站之间选择2个站点,这2个站点的选择必须保证4个站点中有可直达的车,在中间的站点换乘2次,如果选择此出行方式还是没办法到达目的地,则我们就需要考虑进行3次或者更多次的换乘。综上所述,出行乘坐公交车时不仅仅有一种方案,这就需要我们综合花费时间,花费费用等多方面的因素优先选择。所以,这一算法是对不同情况进行综合考虑的结果,也就是用下面所述的权值来衡量最优的换乘方案:
σ=距离×权重%+费用×权重%+景观道路×权重%......
从以上公式我们可以看出,依据不同情况对每种因素所占的权重进行调整,来计算综合因素σ,最后通过比较σ来就可判定多种乘车方案中的哪个是最优方案,以选择最优的出行路线。
2.3 公交数据结构算法与实现的基本步骤
本文通过对最优公交途径的分析,并结合城市公交网络的具体基本特点提出了城市公交数据结构算法与实现的具体步骤:首先,依据城市公交网络建造公交数据结构模型;其次,结合城市公交网络的具体特点把直达矩阵引入公交网络数据的计算,并且可以根据这一直达矩阵把城市公交网络看成是一个“公交网络邻接图”。其三,采用最短路径算法的同时,结合城市公交抽象网络图进行计算,即可得出最少换乘次数以及可能换乘的公交站点。最后,在用建立起来的公交网络模型和所得换乘次数以及可能的换乘站点进行计算,得到了综合考虑最小换乘和最短路径的最佳路径。这样,就实现了人性化的公交乘坐计算方法,给人们的出行也带来了
便利。
3 公交数据结构算法与实现的意义
本文在以上分析的基础上,从乘客的出行心理出发,提出了“换乘次数最少”、“最短路径”等相结合的公交数据结构算法与实现的标准。这些算法在GIS地理信息系统中寻找接点的相邻接点,打破了邻接关心的束缚,使得换乘的搜索和计算成为可能,为乘客提供了起点与终点之间的适合的便利路线。这不但满足了人们“换剩次数最少”的出行心理需求与实现公交出行的科学性,也在一定程度上提高了人们公交出行的意识,对解决城市交通压力过大与交通堵塞等城市交通问题有极大帮助。
4 结束语
总而言之,论述以GIS为基础的城市公交数据结构模型,并且在此基础上提出了公交数据结构算法与实现的思路,这一思路是在分析实际的公交出行情况后得出的结论。文中笔者提到的具体公交数据结构算法其在具体的实用过程中有所提高。但是我们也应看到公交出行的实际情况要比我们看到的复杂的多,还有许多方面都需要进一步研究,相信在未来的公交数据结构算法与实现的过程中我们会取得更好的成绩,最终实现公交的便捷化、快速化、实用化。
参考文献:
1“数据结构”的教学现状
任何实际问题只有建立了数学模型才可以被计算机计算,而数据结构就是实际问题中元素的数学抽象,算法则是建立和解决数学模型的方法。
“数据结构”这个术语在整个计算机科学与技术领域得到广泛使用,它被用来反映一个数据的内部构成,即一个数据由哪些成分数据构成,以什么方式构成,呈什么样的结构等。数据结构是数据存在的形式,也是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
“数据结构”是计算机以及相关专业的一门核心课程,具有承上启下的地位和作用,“程序设计语言”(例如C或C++) 和“离散数学”是它的先导课程,“操作系统”、“数据库原理”、“软件工程”等则是它的后续课程。“数据结构”课程既有相当的理论抽象性,又有鲜明的应用特色,是专业基础课程中的一门有一定教与学难度的课程。
“数据结构”课程一向都有上机实验的要求,但主体通常还是课堂教学,无论是实验设计还是实验强度都远远不够,带有强烈的“验证性”色彩。但是鉴于以下原因:(1) 由于低年级程序设计语言教与学所存在的问题,学生普遍不能顺利地运用程序设计语言工具;(2)对于应用型院校以及许多专业的学生来说,学习数据结构与算法的主要目的应该是在理解的基础之上更好地从事计算机软件的设计与运用。因此,“数据结构”课程的教师必须决定其课程是集中于问题和理论,还是为学生提供一个能够对其进行充分实验的环境,让学生在实践的环节中增加感性认识,产生对相关理论知识的需求。
2教学内容的分层次设计
从1999年开始,经过几年的大规模扩张,人们对大面积扩招后形成的新的高等教育态势进行了重新认识,并把普通高等学校一般地分为研究型大学、教学科研型大学、教学型本科院校、高等专科院校和高等职业院校等几种办学类型。随着高等教育大众化、普及化时期的到来,初步形成了各类大学相对稳定的分层次办学的格局。
根据教育部计算机科学与技术专业教学指导分委员会的“中国计算机本科专业发展战略研究报告”,我们至少可以认为:所在院校的办学类型不同、培养目标不同、所在地及其周边地区社会需求的不同,这些计算机专业的教学内容应该有所不同。作为一门重要的计算机的专业基础课程,针对不同院校不同的教学目的,“数据结构”应该有不同的,分层次的教学设计。
我们认为:对于大多数计算机专业以及IT相关专业的学生,尤其是非研究性院校的学生,应该把数据结构的学习定位在理解、熟悉和能够灵活运用的基础上,而把那些“考研”所需要的更深层次理论性内容放在选修或者考研复习阶段来解决。从长远看,应该对各层次院校的计算机专业所开设的“数据结构”课程的教学内容进行研究,对其教学方法进行积极的探索。
数据结构与算法的应用面广,涉及技术领域宽泛,也被人们赋予了很高的期望值,对于计算机及其相关专业的一般学生和读者来说,肯定是需要掌握的重要专业基础知识之一。另一方面,虽然全部计算机应用技术都有实践性的要求,但数据结构与算法对于应用基础理论来指导开发实践却有着特别的需求,单凭课堂教学和一般作业,要真正领会数据结构与算法课程所介绍的概念、原理、方法和技巧等,是很困难的。因此,要让学生真正理解数据结构与算法的基本知识,具备将数据结构知识应用于社会实践的能力,积极加强数据结构课程的实验环节是至关重要的。
3教学改革、实验创新与成果
根据以上思考,我们在教学内容的安排、实验项目的选择、实验步骤的设计和实验文档的组织等诸方面都做了精心的考虑和安排,尝试为“数据结构与算法”课程编写了主要用于实验也可用于课堂教学的教材《数据结构与算法实验教程》。该教材依据课程教学大纲,充分理解课程的大多数主教材,遵循课程教学的规律和节奏,体现了实验的可操作性,帮助学生切实把握本课程的知识内涵和理论与实践的水平。
《数据结构与算法实验教程》采用C语言作为描述语言,通过一系列与课程单元知识密切相关的实验练习,把数据结构的概念、理论知识与技术融入到实际应用中,从而加深对本课程的认识和理解,逐步熟悉和掌握结构化程序设计方法,提高编程能力和综合分析能力,并为今后学习面向对象程序设计作一些铺垫。实验练习覆盖了“数据结构”课程教学的各个方面,内容涉及数据结构和算法分析基础、线性表、栈和队列、串、树和二叉树、图,以及查找与内部排序等,全书共16个实验练习、1个实验总结和1个附录实验,如表一所示。
实验1:数据结构和算法分析基础。包括数据结构和算法的计算环境、抽象数据类型的表示和实现、算法和算法分析等实验。通过实验来理解抽象数据类型的特点、定义方法和在C语言环境下实现的方法;掌握算法的主要特征和描述方法;尝试通过具体的算法结构,计算算法的时间复杂度和空间复杂度,并对算法进行定性或定量评价。
实验2:线性表。包括线性表的顺序表示和实现、线性表的链式表示和实现等实验。通过实验,掌握顺序表和链表的存储结构定义;实现基本操作算法的描述和分析;进一步理解实现复杂操作的C语言程序的结构,从而更深入理解结构化程序设计的方法;与此同时,加深理解C语言中函数和结构体的结构、语法和使用方法。
实验3:栈和队列。包括栈、队列和递归算法等实验。通过实验,掌握顺序栈和链式栈、顺序队列和链式队列的存储结构定义;掌握栈和队列基本操作的过程及实现的方法;理解递归算法的思路、使用条件以及设计方法,并且了解由递归算法到非递归算法的转换过程中栈的作用;通过实例,进一步加深对栈和队列特点的理解,并区别这两种结构在解决实际问题时的区别,从而更合理地选择适当的数据结构解决实际运用。
实验4:串。包括串的3种常见的存储结构定义、在具体的定义下串的基本操作和实现。通过这个实验,加深理解串这种常见的数据结构的特点和存储结构定义方法;掌握串的基本操作算法的描述,并根据算法的结构评价算法;理解串操作的实现方法,理解一个合理的存储结构定义对具体操作实现的重要性,并注重提高算法的健壮性,从而能更好理会一个好算法所需要的各种综合因素。
实验5:树和二叉树。包括二叉树及其基本操作、哈夫曼树和哈夫曼编码等实验。通过实验,掌握二叉树的不同存储结构定义,并理会在具体的应用中采用合理的存储结构的思路;理解二叉树的先序、中序及后序三种遍历的递归与非递归算法实现过程,加深理解递归算法的设计思路,体会栈在递归算法中的作用,以及在非递归算法中栈和队列的作用;理解哈夫曼树的特点和存储结构的定义思路、哈夫曼树建立的算法和实现,并在此基础上体验哈夫曼编码的特点和设计过程,弄清实现哈夫曼编码程序的结构,从而加深对C语言中字符串和指针的理解和灵活运用。
实验6:图。包括图的表示和实现、图的应用、贪心算法等实验。通过实验,掌握图的各种存储结构的定义方法,从而更进一步理解如何根据实际问题设计合理的数据结构;掌握图的两种遍历方法,即图的深度优先搜索和广度优先搜索,并根据这两种操作的实现过程确定算法中所需要采用的辅助数据结构;能根据实际问题选择图的类型,并采用合理的存储结构,理解解决最小生成树、拓扑排序、关键路径和最短路径等实际应用的算法描述,并能根据算法写出相应的程序代码。根据贪心算法的核心思想理解贪心算法的特点,并学会设计简单的贪心算法。
实验7:查找与内部排序。包括查找、内部排序等实验。通过实验,掌握查找表的特点,并能根据具体的查找方法定义合理的查找表的存储结构;掌握各种查找表的实现思路,能根据查找思路写出算法的描述,并对算法进行评价;掌握哈希查找的特点和影响哈希查找的因素,从而构造合理的哈希函数、采用适当的解决冲突的方法,加深理解C语言中指向函数的指针的具体应用。通过实验,熟悉各种排序方法的特点,并能根据具体的实现方法定义合理的待排序数据的存储结构;掌握各种排序方法的实现思路,能根据排序思路写出算法的描述,并对相应算法进行时间复杂度和空间复杂度计算;体会各种排序算法在最好情况下和最坏情况下的算法评价,并能根据待排序数据的实际分布,制订相应的排序方法。
实验8:数据结构与算法实验总结。全部实验完成后,要求学生回顾所有实验内容,进行一次系统的概括、评价和总结,以巩固通过实验所了解和掌握的数据结构与算法相关知识和技术。
附录:算法描述绘图工具Visio实验。学会在Visio环境下制作算法的程序流程图和N-S图等。
各个实验练习的难易程度不同,实验练习之间的难度不断增加,循序渐进,学生在实验中遇到困难,还可以搜索更早的实验来帮助解决问题。每个实验完成后,要求学生根据个人感受完成实验总结;师生通过“实验总结”和“教师评价”部分,交流对学科知识、实验内容的理解与体会。