1. 引言
数据结构与算法课程是一门面向我校计算机相关专业的重要学科基础必修课,课程共64学时,包括理论讲授48学时、上机实验16学时。课程主要介绍数据结构与算法相关概念、数据结构存储表示和基本操作、典型算法设计策略及其应用,在学生专业能力培养中,本课程为培养学生形成专业领域问题求解能力和创新实践能力起到重要支撑作用。
课程遵照学校“宽口径、厚基础、强实践”的人才培养要求,依据专业人才培养方案,制定了知识、能力、素质三维教学目标。知识目标包括:理解数据结构与算法的相关概念,理解算法时间、空间复杂度的分析方法;掌握表、树、图等基本数据结构的存储表示和相关算法;掌握查找和排序两类常见问题的具体求解算法;理解分治法、贪心法、动态规划、回溯法和分支限界等算法设计典型策略。能力目标包括:针对具体工程问题,能够采用表、树、图等基本数据结构描述数据以及数据之间的关系;能够采用合适的存储结构存储数据以及数据之间的关系,能够设计编写有效的算法求解问题;能够利用算法时间、空间复杂度分析方法对同一问题的不同求解算法以及同一算法的不同实现方案进行分析和比较;能够熟练使用Microsoft Visual C++等C语集成开发环境编程实现算法。素质目标包括:培养学生严谨求实的科学态度、精益求精的工匠精神和不断探索的创新精神;培养学生科技报国献身国防的家国情怀。
2019年教育部发布《关于一流本科课程建设的实施意见》[1],提出以“学生中心、产出导向、持续改进”的新理念引领一流本科课程建设。学生中心的内涵是以学生发展为中心、以学生学习为中心以及以学习效果为中心[2],产出导向又称目标导向,从课程教学角度来看,指的是以达成课程教学目标为导向,持续改进和目标导向是相辅相成的关系,强调建立有效的目标达成度监控和改进机制,推动教学质量不断提升。基于这一理念,开展课程教学改革创新的思路是以提高教学目标的达成度为改革目标,从找出教学过程中阻碍教学目标达成的真问题出发,从教学内容、教学方法等多方面提出解决问题的对策,同时设计有效的考核方式评价改革成效并持续改进。
目前,全国高校数据结构与算法课程教学改革开始由知识传授向能力培养转变,相关研究已经做出了一些有益的探索[3]-[5],但目标不同、学情差异使得这门课在提高教学质量上还存在改进的空间。本课程团队自2020年开始探索面向能力培养的课程线上线下混合式教学改革,教学效果逐年提高。下面主要从剖析课程教学问题出发,围绕重构教学内容、创新教学方法和改革考核评价三个方面介绍我们的探索实践。
2. 教学中存在的问题
2.1. 学习兴趣难调动
数据结构与算法是一门应用性广、实践性强的课程,但由于抽象概念较多、代码形式较为枯燥,学生听课很容易分神;同时,受前期编程基础差异的影响,不少学生在实验过程中无法自主完成代码的编写和调试,很容易让学生在连续受挫中失去对课程学习的兴趣。因此,如何建立知识点学习与解决实际问题的关联性,使学生保持对课程学习的兴趣,让学生从必须学变成愿意学是第一个亟待解决的问题。
2.2. 计算思维难建立
在面对具体问题时,学生往往只能从人思考问题的角度讲出其大致的解决思路,但无法从计算机角度将这种思路阐述成机器可执行的算法。学生上课通常会出现“一听就懂,一实践就不会”的现象。这种现象反映出学生的计算思维培养还有待加强的问题,不能按照问题抽象、数据组织和算法设计的思维过程分析问题、解决问题。因此,如何帮助学生建立计算思维,让学生从能听懂变成会应用是第二个亟待解决的问题。
3. 课程教学改革实践
针对上述课程教学中存在的问题,要想提高学生的学习兴趣,关键在于让学生感受到数据结构与算法课程既有用,又有趣,形成学习的内驱力;要想帮助学生建立计算思维,重点在于让学生体会利用计算思维求解问题的过程,潜移默化建立自己的认识观、方法论。
3.1. 重构教学内容
(1) 以具体问题为牵引,重新组织教学内容
问题是最好的老师,在课程每个知识单元讲授前先引入学生感兴趣的问题是激发学生深入学习的前提。因此,本课程根据每章教学内容的特点,在数据结构和算法设计两大模块引入不同的问题案例,既作为知识单元讲授的出发点,也作为实践项目设置的落脚点。在数据结构模块,针对表、树、图基本数据结构,通过引入具有不同逻辑关系和操作特点的问题案例,重在培养学生利用计算机分析和表征客观事物的能力。在算法设计模块,针对查找、排序算法,通过引入生活中常见问题案例,重在培养学生形成运用程序逻辑求解问题的方法论;针对分治、贪心、动态规划、回溯和分支限界等算法设计策略,通过引入经典和前沿相结合的问题案例,帮助学强化计算思维,并初步具备探索问题求解新方法的能力。课程教学内容以及引入的工程问题如表1所示。
(2) 持续更新知识点应用场景,反映学科新技术新方法
要想调动学生的学习兴趣,必须建立起教学内容与当前技术发展前沿的耦合机制,使之始终处于“新”的状态。本课程在每轮授课中,结合课程知识点和学生认知水平筛选与当前计算机与网络应用技术结合紧密的应用场景,促进学生形成学以致用的内在动力。
例如,在讲授特殊矩阵的压缩存储知识点时,引入图书推荐系统在设计中如何实现基于用户的协同过滤算法问题。该算法是当前许多互联网平台采用的一种常用推荐算法,其基本思想是根据与目标用户兴趣相似的用户的喜好来向目标用户推荐物品。在算法实现时,首先采用效用矩阵来记录用户对不同图书的偏好,然后基于效用矩阵计算用户之间的相似度并采用相似度矩阵存储计算结果。在实际应用场景中,当用户和图书的数量都非常大时,效用矩阵往往是一个高阶稀疏矩阵,而相似度矩阵是一个高阶对称矩阵,都属于特殊矩阵,为了提高推荐算法的空间效率,可以对这两个矩阵进行压缩存储。以这样一个实际问题作为背景,将目前应用非常广泛的协同过滤算法与课程教学内容有机结合起来,能够让学生在课程学习过程中一直保持较高的获得感。
Table 1. Course teaching content with the introduction of engineering problems
表1. 引入工程问题的课程教学内容
课程模块 |
知识单元 |
实际工程问题 |
数据结构 |
线性表 |
图书管理系统 |
栈和队列 |
浏览器前进/后退功能实现 |
串、数组和广义表 |
word软件查找功能实现 |
树和二叉树 |
数据压缩问题 |
图 |
通信网络建设问题 |
算法设计 |
查找 |
word软件单词拼写检查功能实现 |
排序 |
快速获取热门搜索关键词问题 |
典型算法策略 |
无人机路径规划问题 |
(3) 建设多层级实训内容,满足差异化学习需求
随着课程教学实施的不断深入,不同学生的学习效果逐渐出现一定的差异,如何保证基础一般的学生能够“吃得饱”,达到课程教学目标的平均线,又让基础较好的学生能够“吃得好”,增加课程学习的挑战度,需要对课程进行多层级教学资源建设,满足差异化学习需求。因此,本课程基于Educoder平台建设了“基础 + 提高 + 拓展”多层级实训内容。学生可以根据自身学情进行自主选择。
例如,在树和二叉树知识单元上机实验环节中,针对编写程序利用哈夫曼算法对输入数据进行编码和译码这一实验内容,设置了“哈夫曼算法”和“数据压缩问题”两个实训项目,其中,“哈夫曼算法”实训项目提供了代码框架,学生需要在理解代码框架的基础上对关键函数进行补充,而“数据压缩问题”实训项目需要学生自主设计数据结构以及相关函数,难度和挑战度更高。
3.2. 创新教学方法
(1) 突出学生主体地位,以问题链为牵引设计多样化学习活动
围绕教学目标的达成,结合教学内容的特点设计问题链,以问题链为“藤”串接相关知识点,在“顺藤串瓜”过程中设计多样化学习活动,将学生“卷”入课堂。
在学习串的模式匹配算法时,结合教学内容是介绍解决一个具体问题的两种性能不同的算法这一特点,设计“问题是什么→如何求解该问题→如何优化求解算法”的问题链,依次串接模式匹配问题定义、BF算法、KMP算法等教学内容。在介绍KMP算法时,针对如何计算模式串对应的next数组这一关键问题设计小组讨论活动,让学生分小组讨论在三种不同情况下next数组的计算方法,然后进行小组汇报并由师生共同完成归纳小结,最后依托雨课堂计算给定字符串的next数组值,对学习效果进行检测。
在学习哈夫曼算法时,设计“如何求解数据压缩问题→如何构造最优前缀编码→如何构造最优二叉树”的问题链,依次串接带权路径长度的概念、最优二叉树的定义、哈夫曼算法等教学内容。在介绍哈夫曼算法时,针对如何优化在森林中找到根结点权值最小的两棵二叉树的时间效率这一问题,设计角色扮演游戏,让一部分学生扮演森林中的二叉树,另外两个学生分别扮演指向根结点权值最小和次小的两棵二叉树的指针,在游戏过程中引导学生发现优化思路,然后让观看游戏的学生进行归纳小结,最优依托Educoder平台开展编程实践,检测学生的学习效果。
(2) 遵循能力生成规律,依托信息化平台创新实验教学模式
数据结构与算法课程的教学目标是利用计算思维采用程序化方法解决复杂工程问题,大量的编程实践是达成这一教学目标必不可少的关键环节。但现实情况是课程的上机实验课时安排偏少,不足以支撑教学目标的有效达成。王彤等[6]提出了按照难易程度将实验内容分为验证型、设计型和综合创新型三类,在课外线上开展验证型和设计型实验,在课内线下开展综合创新型实验的做法。受此启发,本课程依托Educoder平台构建不受时间、空间限制的线上实验教学环境,创新尝试“线上线下混合、课内课外融合、理论实验结合”的实验教学模式。
在课内,除了16学时上机实验之外,在48学时理论讲授过程中根据教学目标达成的需要合理融入编程实践活动。链表的基本操作是学生接触到的第一个难点,同时也是二叉链表、邻接表等复杂链式存储结构的基础。为了达成能够编写程序实现对单链表的增、删、查、改等基本操作的教学目标,依托平台设置补充关键代码、实现在单链表中查找第i个结点,并在之后插入新结点的编程活动。在课外,学生根据自己的学习需求自主安排上机实验的时间地点,依托平台编写代码、发现错误、查找问题。老师依托平台提供的学习数据掌握学生实验进展情况,对于共性问题,在课上通过师生互动和生生互动集中进行分析讨论,对于个性问题,在课下单独进行一对一指导。
(3) 重视学生自主体会,结合课程特点有机融入思政元素
针对高等教育立德树人根本任务,通过挖掘教学内容中蕴含的思政元素、在课程实践中融入思政元素以及老师言传身教三种途径开展课程思政。
在学习串的模式匹配算法时,对比BF算法和KMP算法在失配时的不同处理方法以及算法时间复杂度的差异,BF算法采用蛮力的处理方法,而KMP算法巧妙运用失配之前得到的部分匹配结果,从而减少了字符比较的次数,相较于BF算法提高了算法效率,由此引申到在科学研究中遇到困难时善于总结经验并从中获得灵感的创新精神。
数据结构与算法课程非常强调编程实践,在实践环节融入思政元素是非常具有课程特点的做法。王昭等[7]提出了在实践题目背景中恰当融入思政元素的做法。受此启发,本课程设计了学生自主体会为主,老师提问引导“留白”的实践环节思政融入方法。在学习查找时,设置在二十大报告中统计关键词“人民”的编程任务,让学生通过观察程序的输出结果直观看到“人民”非常高频的出现在党的二十大报告中,再由老师提出问题“为什么人民一词在党的二十大报告中出现次数如此之高?”引发学生思考,自己走完课程思政的最后一公里,感受中国共产党“以人民为中心”的执政理念。
在授课过程中,老师秉持严谨求实的科学态度和精益求精的工匠精神,在课堂之外,通过微信、电话等形式及时解答学生问题,以身体力行的奉献精神感召学生。
3.3. 改革考核评价
课程建立由过程性考核和终结性考核相结合的多元考评体系。过程性考核包括客观题作业和实训项目,占课程总成绩的40%;终结性考核采用期末闭卷笔试,其中单项选择题占30%、判断题占10%、计算题占30%、算法设计题占30%,占课程总成绩的60%。
围绕解决问题能力达成度的检测,刘城霞等[8]提出针对学生能力水平差异分层次进行实践考核的做法,受此启发,本课程设置多层级的能力考核内容,包括基本能力考核、应用能力考核和综合能力考核三个层次。其中,基本能力考核考查学生实现对表、树、图等基本数据结构的存储表示和基本操作的能力;应用能力考核考查学生使用一种或两种数据结构解决简单问题的能力;综合能力考核考查学生综合运用数据结构与算法解决复杂工程问题的能力。这些考核分布在客观题作业、实训项目和期末考试当中。
过程性考核依托Educoder平台伴随学生课程学习全过程无感化开展,由平台根据标准答案或测试项自动评分,为激发学生的学习动力,在实训项目中设置效率分,根据学生“作业通关时长”进行效率评分;期末考试中算法设计题采用非标准化答案评分,根据学生设计算法的正确性和效率差异进行评分。
4. 课程教学改革成效
经过面向能力培养的课程教学改革之后,对2021~2023年的课程考核成绩进行了对比,如表2所示,发现课程考核的平均分和优秀率逐年上升。
Table 2. Comparison of the assessment results of courses in the autumn semesters from 2021 to 2023
表2. 2021~2023年秋季课程考核成绩对比
开课时间 |
考核人数 |
及格人数 |
及格率 |
优秀人数 |
优秀率 |
平均分 |
2021秋 |
54 |
54 |
100% |
1 |
1.8% |
78.5 |
2022秋 |
43 |
43 |
100% |
5 |
11.6% |
79.5 |
2023秋 |
63 |
63 |
100% |
16 |
25% |
83.7 |
此外,近两年来,学生参加“蓝桥杯”全国软件和信息技术专业人才大赛、中国大学生计算机设计大赛人数明显增加,获奖项目也有所增加。在学院课程满意度测评中,学生对本课程总体满意度高达100%。
5. 结论
本文描述的面向能力培养的数据结构与算法课程教学改革是经过四年的改革实践后得到的经验成果。通过分析一系列的数据后发现,这种以提高学生利用计算思维采用程序化方法解决复杂工程问题的能力为目标,以解决课程教学中存在的问题为抓手的教学改革对学生的帮助很大,有效提升了学生的学习积极性,强化了其计算思维的养成。但是,随着科技的进步,尤其是人工智能技术的飞速发展,课程教学领域的改革依然要随着技术和学情的变化而不断探索,始终保持让课程教学跟上时代前进的步伐。
基金项目
本文得到安徽省教育厅高等学校省级质量工程教学研究重点项目“数据结构与算法课程高阶性教学研究”(2022jyxm1210)资助。
NOTES
*通讯作者。