分享

Project X记录(4)《不插电的编程课——搜索算法》

 长沙7喜 2018-05-04


張飛

清华大学终身学习实验室课程设计主管

算法

是“计算思维”或“人工智能”的核心内容。在小朋友们的日常生活中,与“算法”关系密切的事物之一,就是“互联网搜索”。


很多六、七岁的孩子已经可以熟练的使用互联网搜索引擎了,但是他们能理解其背后的搜索算法吗?特别是在“不插电(不用任何电脑等 Hich Tech 设备)”的教学环境下?


我们是酱紫教孩子搜索算法的。


课程目标


理解并在游戏中运用三种常用的数据搜索算法:线性 ( sequential ) 搜索算法、二分法 ( binary ) 搜索算法、散列 ( hashing ) 搜索算法。


  培养计算机科学素养。


课程工具


☆ 洗手液 (最好是免冲洗)

☆ 写有数字的卡片

☆ 健康好吃的糖果

☆ 游戏《大海战》图纸 & 签字笔

☆ 白板&白板笔


课程时长


120分钟


课程设计思路

☆ 线性算法就是逐一比对数据,是最简单、最低效、没有什么“算法”的算法。


☆ 二分法算法用于已排序数据,每次取中间值查询,不断缩小范围。


☆ 散列法算法是将数据按照一定的方法换算成便于查找的关键字,所有的关键字组成“关键字表”,然后按照关键字表分组数据。这样在查找时可以快速定位到数据所在组,并在组内进一步查询。


对于这个年纪的孩子来说,本课程更多的是“计算机科学素养”的培养,而非“算法课程”;因此对孩子的要求仅是理解和游戏中的应用。


因为课程运用了一定的数学知识,有一定难度,为了避免枯燥,课程设计要注重强化趣味性。


因此,特意设置“暖身”环节,并在课程中全程用游戏贯穿教学内容。


暖身环节让孩子快速体验线性算法,并思考排序数据的搜索算法,带着问题进入主体游戏。过程中加入糖果小奖品,强化娱乐性。


主体游戏采用海战游戏的形式,两人一组;用三套棋盘分别执行三种搜索算法,让孩子在游戏中体验算法的使用环境和执行效率。


课程后让孩子向父母讲述三种搜索算法的基本原理,强化理解。


课程预备


☆ 两位数的加减乘除运算

☆ 英文字母表


课程设计详细流水账


“全都去把手洗的干干净净的!我们一会儿要吃好吃的!”


从第一句话开始,我就在调动他们的情绪。要是不让他们燃起来,这两个小时的“数学课”可不好上。


如果可以给孩子们准备免冲洗手液更好,普通洗手液也可以,让孩子们把手洗干净,好抓糖吃。


接着让孩子们手拉手围成一个圆圈,用“手心手背” + “猜丁壳”确定一个站在圆心的孩子。


这个孩子会有机会获得更多的糖果,所以选择过程一定要严格、公平,不然一定会有孩子不满意。


给外圈的孩子每人发一张写有数字的卡片,让孩子捂好,只有自己能看到数字。


给圆心的孩子一个装有糖果的盒子,糖果数量等于外圈孩子的数量。



然后我开始宣布游戏规则:老师随机给出一个卡片上的数字,圆心的孩子要用提问的方式,找出持有这个数字的卡片的孩子。她每问一个孩子,被问的孩子就要亮出卡片,同时得到一块糖果;直到最终找到数字,此时盒子里剩下的糖果就都归圆心的孩子所有。(所以理论上,圆心的孩子最多可以拥有 总数-1 个糖果,最少一个都没有。


圆心的孩子会想方设法寻找蛛丝马迹,察言观色;圆圈里的孩子也会叽叽喳喳筹谋划策,但还是会毫无头绪,最后只能一个个的蒙(其实就是在实施线性搜索算法)。


找出数字后,一起做一个小小的总结。我们用了什么办法找到老师给的数字的?一个个问的。有更好的方法吗?好像没有。


好,下面我们开始升级游戏。老师给圆心的孩子也发一张数字卡,让她站回圆圈;所有的孩子按照卡片数字顺序排列,重新站队,围成一个新的圆圈。


大家可以一边吃糖,一边在老师的带领下共同思考:在重新排序的情况下,我们想最快找到一个数字,该怎么办呢?


孩子们会有各种奇思妙想的方案,不过都有问题。这个时候老师不能揭晓答案,要让他们畅所欲言,再用提问的方式,帮助他们发现问题,进一步思考。带着思考,我们结束热身活动,准备开始正式游戏——大海战!



开始前,我必须先把今天的主题引出来,要让孩子明白我们在干什么。


“有谁用过互联网搜索?”


齐刷刷的举手。


“老师我拿我爸手机用过百度!”


“老师我用谷歌不用百度!”


“老师我用过美团外卖!”


果然是移动互联网原住民啊,我像他们这么大的时候连计算器都没见过。


但是有长处也就有短处。没有经历过数字时代的发展,他们就会缺少一些计算机科学的基本常识。


我曾遇到过孩子甚至以为,电脑里就真的有一个个图标,一个个窗口。


这也是我们设计这节课的最主要目的:给孩子一些计算机科学的“基本素养”。


“那么大家想过没有,互联网上那~~么多的信息,搜索引擎是怎样那么快的找到他们呢?”


小朋友们马上张大了嘴巴,一脑袋问号……是哎,好像从来没想过这个问题啊!是怎么找到的呢?


我转身在白板上写下两个字:算法


从这里开始,正式把算法的概念教授给孩子。


当我们在大量的数据中搜索的时候,我们要用到一些巧妙的的计算方法,来加速搜索的过程,这就是“搜索算法”。


“大家先想想刚才的小朋友是怎么找到数字的?”


“她蒙的!”


“她一个一个问的!”


“那么一个一个问是不是一种算法呢?”


是的,这是一种算法,一种最简单的算法,我们叫它线性算法,或者顺序算法。当数据量不大,排列无序,数据本身很简单的时候,这也不失为一个有效的方法。比如刚才玩的热身活动,搜索简单的数字而已,一个个问其实是最快的。



“下面我们就来一起玩一个很紧张刺激的游戏,《大海战》!看看我们能不能用算法来取胜!”


下发第一套海战图和签字笔。孩子分成两人一组,一人持图1A,另一人持图1B。



老师宣布游戏规则:游戏目标是用最少的炮弹击中敌方的军舰;游戏开始时,每人选择一艘自己的军舰,告诉对方军舰上的数字(不是英文字母!);两人轮流猜测军舰所在的位置(英文字母),每猜测一次,计导弹发射一次;用最少数量的导弹击中对方军舰(猜到军舰的位置)者获胜。


有了刚才的热身活动,孩子们马上明白,这些无序的数字,没有什么好想的,一个一个猜,看谁运气好。



真有一炮命中的,兴高采烈。也有二十几次才猜到的,好在场面很热烈很欢乐,小朋友也不会很沮丧。😂



进行的差不多了,带着孩子简单小总结一下:


可能的最大分数和最小分数分别是多少?26 和 1。


这些数字排列有规律吗?没有,无序的。


大家用了什么方法?线性算法。


还有什么好方法吗?孩子们说了一些。嗯!Good Try!但是基本还是在蒙。



接下来,海战升级!给大家发放第二套海战图:2A 与 2B。



还是老师带着孩子先观察:看看这次的数字有什么不同?



孩子们看出来了:数字越来越大!


是的!这次海战,战舰数字是按顺序排列的!


“还记得刚才我们也遇到了这种情况吗?当时大家都想了什么方法?现在就可以试试!”


规则与第一轮基本一致,只是在每次猜测时,需要告诉对方“大了”或“小了”。


如果没有学过,几乎不会有孩子能想到要取中间值不断逼近。


但是他们也会有很多很好的尝试,比如有的孩子会想:“我要取一个比较靠近最大值的位置,如果小了,那我就能排除掉很多可能性!但是万一大了怎么办呢?那我就取一个靠近最小值的值!可是……”他就陷入死循环了。其实他离真理只有一步之遥了。



看火候差不多了,老师可以喊停了。听孩子们说一说自己的想法,经过引导后,可以在黑板上写下第二个算法的名字了:二分法


二分法的神奇之处在于,即使数据量翻了一倍,我们也只要多加一次查询。当数据量不断翻倍的时候,二分法的魔力就凸显的更明显。这里,还可以给孩子讲一讲“阴险的老爷爷让不懂数学的国王往国际象棋盘里放米粒”的故事,孩子们会惊讶于指数增长的神奇力量,反过来想一想,就明白了二分法的强大威力。



再回到我们的游戏,如果用二分法,最多几次就能打到敌舰?孩子们一算,5次!好,趁热打铁,再做几个小练习:老师心里想一个100以内的数,让大家用二分法来搜索;再来个1000以内的数,再练一次。到此,孩子应该可以熟练使用二分法了。



游戏再次升级!


第三次大海战马上开始!给孩子们发第三套海战图:3A 和 3B。



和孩子一起观察,这次的数字又有什么不同?



其实孩子观察不出来,还是宣布好了。🤣 


每艘船上几个数字之和的尾数与船所在的列数是相同的!


其他的游戏规则还是和之前一样。


“哇!那这次太简单啦!”孩子们能这么说,说明他们的思路非常清楚。


开始玩吧!



这次进行的非常快,很快都得出了结果。


大家用了几次击中了敌舰?最少一次,最多四次。为什么是四次?因为一列里最多只有4艘船。


像我们这样,把搜索的数据按照一定方法算出一个关键字,很快定位到一个很小的范围,再在小范围内去查找的方法,叫做——我转身写下第三个算法的名字——散列法


其实散列法我们大家可能都用到过!有小朋友翻看过微信里的联系人吗?我们按住联系人右侧的小字母,就可以快速定位到姓氏拼音首字母的位置,再在这个首字母里去寻找,就非常快了。这其实就是一种散列法的运用。



那么线性算法、二分法和散列法,哪一种最快呢?在实际使用中,散列法一般是最快的一种方法。但是如果分组方法不够好,在同一列里有太多的数据,散列法就很低效了。所以我们面对不同的数据,需要具体分析,使用合适的搜索方法!


好了,感觉孩子们烧脑烧的差不多了。最后布置一个作业:回家把这三种搜索方法给爸爸妈妈们说明白了。只要能说明白,我们的教学目标就达成了。


下课!



关于《不插电的编程课》

本课程是清华大学终身学习实验室《不插电的编程课》系列课程中的一节。

此系列课程面向刚刚步入小学的一年级学生,旨在用最简单的工具(摆脱电脑等复杂、昂贵的教具的限制),游戏化的学习方法,教孩子学习计算机科学知识。

关于Project X

Project X是TULLL是一门实验性质的课程,面向6到7岁(小学一、二年级)的小朋友。Project X 的教学目标是尽可能的开发孩子的创造力。

Project X可以被理解为“编程实验班”,但我们使用的主要学习工具远远不限于是编程。电脑编程仅仅是提升创造力的落脚点和工具之一。

目前Project X第一期已经开课,未来可能会有其他课程,请您关注TULLL的公众号。

特别鸣谢



本课设计过程中,得到了 TULLL研究主管、清华大学心理学系助理教授伍珍老师的大力帮助。

她在建立儿童自信心、成长型思维,培养儿童创造力方面,给出了诸多建议。

在此特别鸣谢!


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多