阿力木江·亚森
(新疆财经大学信息管理学院,新疆 乌鲁木齐 830013)
以问题为基础的教学方法是一种以实际问题作为激发学生学习的动力和引导学生把握学习内容的教学方法[1]。除了课程内容,以问题为基础的教学方法可以促进学生的批评性思维能力、解决问题能力和沟通技巧的发展。它还可以提供小组工作,查找和评估研究材料以及终身学习的机会。以问题为基础的教学方法可以融合任何学习情况,在严格的定义中,该方法可作为主要的教学方法。任何科学领域都可以通过一点创新来适应于以问题为基础的教学方法[2]。
目前普遍的数据结构教材的内容基本一致,内容缺乏让人感兴趣的案例,基本上先介绍概念后提供一些例子,却不提供各类数据结构的来源,并不回答学生脑子里的很多“为什么”。这是在很多科学领域的教材中普遍存在的问题,难于理解,不够仔细。
传统教学方法基本上根据教材的结构进行,因此自然会进行先理论后实践的模式,对思维方式还没成熟的学生来讲,掌握理论困难。虽然数据结构是软件开发的基础知识,传统教学方法基本不允许提供比较完整的软件开发案例。
传统教学模式基本上不提到教材以外的内容,教学方法单一。不过,目前在各个高校使用的数据结构教材缺乏多样性,各个教材中的例子和案例几乎一致。经过几年的数据结构教学经验可知学生对数据结构的热情度不高,更感兴趣网站开发、大数据等,主要原因是这些课程的教材来源多样,学生自己也可以找到一些易于理解,以案例为主的书籍[3][4]。
为了让学生充分地了解并掌握数据结构的意义和各类数据结构的来源,应该第一节课开始提供实际软件开发案例。例如,一个简单的学生管理学系统,让学生回答其中要处理什么数据,基本数据元素是什么,数据元素之间存在什么样的关系。通过这么一个例子可以更好地解释什么是数据,各类数据结构的含义及其应用。可以指导学生进行一个角色游戏的分析,例如,其中包含时间、角色,交易等概念,从这些角度来可以体现出线性结构,树形结构和图形结构的概念及其应用。此基础上,最后对它们进行总结相当于介绍相关理论。
根据授课内容,可适当地选择不同规范的问题,启发学生的想象力。上述所提的软件开发案例适合于解释数据结构的大概念。数据结构的授课内容包含一系列经典算法,在它们的解释中先提出一些小问题,然后对问题进行总结,最后介绍适用于解决这一类问题的算法。例如,最短路径问题的授课中,可以提到交通堵塞问题,其中瓶颈正是关键路径所经过的一条边,也就是为了提高效率必须找出这些瓶颈。经典算法应用的问题众多,易于提供例子,有利于提高学生的积极性。例如,哈夫曼编码的介绍中可以提出“如何最快的速度发出去信息量最多的最小电报”的问题。
数据结构的授课只讲理论不讲怎么编写可对编程能力较强的学生可行的,但对编程能力一般或者还没完全掌握计算机语言编程的学生来说不可行。在编写一个完整的数据结构的过程作为一个案例,鼓励学生一起编写,善于找出学生表达不出来的问题,协助学生通过编写掌握理论。
数据结构和算法对于任何程序员来说都是必不可少的,因为了解它们是成为更好程序员的关键。对算法和数据结构有深刻理解的工程师将能够做出明智的设计选择,并编写性能更高且更易于更改的程序。作为初学者,学生可能会对新概念感到气馁和沮丧,并且常常因为这些主题听起来非常抽象而感到害怕。这在意料之中,而老师的工作就是想办法缓解学生的紧张情绪。我们相信在课堂上做以下几点会对学生有所帮助。
1.展示内容:在任何一门新课程的第一堂课上,学生通常不知道他们要学什么。他们只知道新课程是关于什么,仅此而已。正因为如此,许多学生对课程主题并不真正感兴趣。对于教师和学生来说,重要的是要确定课程的内容,更具体地说,每章的内容以及它对他们有何用处。数据结构源是关于为软件开发中出现的问题提供一些基本的解决方案。老师必须通过提供一些有趣的例子而不是太多细节来明确这一点,让学生感到放松并集中注意力。例如,鼓励学生思考如何开发国际象棋游戏。鼓励学生想象一场简单的国际象棋比赛,学生们会发现有很多事情需要考虑。其中,最重要的是如何让国际象棋程序记住之前的比赛状态,以防棋手想要撤销当前的举动,并为上一步采取不同的策略。这个问题代表一个经典的树形结构。通过了解国际象棋比赛的轨迹类似于树形结构,学生将说服自己数据结构在现实世界中很重要。上面提到的例子起到吸引学生注意力的作用,同时也提供一些关于数据结构的用处。然而,现在还不是开始教授这门学科的时候。现在最好介绍一下每章的内容,或者整个课程的总结。整个课程可以概括为以下单独的主题:数组、列表、堆栈、队列、树、哈希表、图和排序算法。简单地提及这些并为每个示例提供一个示例,可以显著帮助学生阐明接下来几周将要发生的事情。
2.将实际问题与编程相关联:甚至在教授此类数据结构之前,就以现实世界的问题为例,例如国际象棋游戏、导航问题及其适当的数据结构,可能会鼓励学生更加热情地学习课程。最重要的是,这样的聊天有助于学生将现实世界的问题和编程任务联系起来,激励他们在脑海中思考他们的梦想项目(如果存在的话)。此外,反过来提到这些问题自然会导致在他们的解决方案中应该使用什么数据结构。
3.将编程与数据结构相关联:一提到现实世界的问题,学生的第一反应很可能是“解决这个问题的第一步是什么?”。对于提出的每个问题,这都是一个有利的想法。数据结构课程教会学生分析问题。许多现实世界的问题可以归类为一种基本数据结构:列表、树或图。观察本题处理的基本数据是什么,数据对象之间的关系是什么,学生将掌握识别问题与数据结构的相关性,然后思考如何编程,由此引出算法。
4.将数据结构与算法相关联:一旦学生理解了数据结构的真正含义,那么他们可能会根据手头问题的复杂程度感觉到需要一些算法。这一刻很清楚,数据结构不仅是关于如何表达和解决现实世界的问题,而且是关于如何解决一些计算机特定的问题。我们需要一些复杂的数据结构中的算法。这个时刻非常适合向学生介绍相同任务但不同数据结构的算法,例如在树和图中搜索,并且由于存储的数据的底层结构,它们的工作效率有所不同
5.提供大量示例但不要太多:提倡在课堂上提供例子但不建议介绍太多。示例应尽可能具有代表性和简单性。尽管用例子轰击学生似乎很好,但大多数例子的重点各不相同,因此可能无法对手头的问题提供系统的解释。正确的做法是从最简单最相关的例子开始,然后解释一些正式的内容,最后总结。课堂的具体和抽象部分必须平衡,以提高学生思维的各个方面,实践和理论知识的发展比只关注其中一个要好。
6.使用可视化工具:对目前流行的几种数据结构教科书来说,很难将它们视为有趣且易于学习。他们通常遵循传统的教学模式,介绍一些无关紧要的例子,然后介绍一些概念,最后解释如何对这些问题进行编程。这里的问题是,即使学生成功地编写出各种数据结构的程序,也没有成就感,因为这些程序距离用于解决实际问题还差太远。因此,久而久之,学生就会失去兴趣,尤其是学习意愿不强的学生。在某种程度上克服这个问题的一种方法是在一些合适的主题中使用可视化工具,例如排序、图形搜索。这将帮助学生通过以不同的方式呈现内容来专注于课程。
7.使学生拥有成就感:学习成果不断鼓励学生学习。因此,让学生觉得他们正在学习有趣和有用的东西是很重要的。同样,现实世界的问题和编程的例子正是这样做的。因此,教师必须选择2-3 个完整的案例,并鼓励学生利用从数据结构课学到的知识来完成它们。这样的例子应该针对实际问题而不是针对某些概念
8.精选示例:(1)众所周知的斐波那契数列非常适合在列表中引入。这个问题有点简单的性质使它成为数据结构课程开始时的理想选择。教师可以要求学生分别使用列表、堆栈和队列生成斐波那契数列。一旦学生完成,这三种基本结构的区别学生就会一目了然。(2)在文本编辑器中撤销功能是堆栈的一个真实示例。提到这一点,同学们可能会想到类似的应用,比如在浏览器中前进和后退。(3)链表的一个真实例子是音乐播放器,用户可以使用循环模式依次播放多首歌曲。(4)二叉排序树搜索算法的现实场景之一是验证应用程序中的用户凭据。此外,这种搜索算法可以在许多游戏中找到,用于定位元素的位置。(5)Huffman 编码用于密码学和数据压缩。在解释了该算法的工作原理后,不难将其视为一种数据压缩,因为将大信息转换为具有相同含义的小信息。含义隐藏在这些代码中,而失去了信息的原始表示,这意味着它也是一种密码算法。(6)图形可以通过旅行来解释。这是一个非常现实的问题,很容易在旅行中提出许多决策问题,例如如何到达一个地方,去某个地方的最佳道路是什么。也许此时,仅学生就可以想到图及其算法的众多应用。一个有趣的例子是Facebook使用图数据结构来实现关注者。学生应该能够说服自己图形无处不在。(7)哈希表。这是用于快速存储和搜索数据的最常用的数据结构之一。与树和图不同,哈希表可以以更简单的方式实现。解释为什么在某些情况下树和图不够用是至关重要的。主要原因是构建这些数据结构很昂贵,更重要的是没有必要。在存储了很多不相关的信息,以后又想快速查找的情况下,唯一的选择就是哈希表。哈希表的实际应用是在路由器中存储IP地址。(8)DFS 和BFS 是图中的基本搜索算法,其他搜索技术都是它们的变体。现实世界的例子包括用于网络爬行的搜索引擎,寻找地图中两个地方之间的最短路径。
数据结构是计算机专业的核心课程之一,学习数据结构是为了更好地管理数据,能开发出更复杂的软件。不过,目前很多高校还在用传统教学方法,以教材为主,不重视引入更多更有趣的案例和例子融合到授课过程中。本文主张数据结构的授课应该以问题为基础的教学方法,每一个概念与算法应该按照提出问题,引导学生思考,对问题进行分类,最后以提出解决方法的形式介绍理论的方式进行。这样有利于学生更容易掌握相关理论及其实践,可进一步地提高学生的思考和解决问题能力。