摘 要:本文的主要内容包括:二分查找的算法思想;讲解中不易理解、掌握的原因;通过游戏理解算法。通过游戏中学习二分查找的算法思想教学过程,让学生参与其中,体验过程,分析原因,得出结论。
关键词:二分查找 游戏理解算法 游戏
一、二分查找的算法思想
在已经排好序的数列中,首先找到中间的记录,这时可能会出现三种情况之一(假设按升序排列)。
1)该记录对应字段的值小于查找关键字,此时应在前半部分记录中继续查找。
2)该记录对应字段的值大于查找关键字,此时应在后半部分记录中继续查找。
3)该记录对应字段的值等于查找关键字,那么就已找到了查找目标,查找结束。
如果出现前两种情况,则继续在前半部分或后半部分内进行对半查找,直到出现第三种情况为止。如果沿指定方向测试完成所有记录时仍未出现第三种情况,则表示未找到查找目标,查找也结束。
二、讲解中不易理解、掌握的原因
单看这一串算法思想的解释有些学生便有些没有耐心了,更不用说去掌握应用了。或者有些人生硬地记住了这些原理却没有真正地理解,写程序时也会漏洞百出的。只有让学亲身体会了查找的过程,才能理解算法思想,才能想到编程时的条件设置及注意点。从而真正达到理解、应用的最终目标。
三、通过游戏理解算法
游戏过程如下:
第一步:把10名同学按身高从低到高排成一列,并依次排号为1到10号。并另找一位学生,称为X,找一找10人中有无与X同样身高的。若有则输出他的号码。
第二步:让其它学生自己想方法去解决这个问题。讨论之后学生得出了这样一个结论:把X与这一列中1号到10号的每个人依次比较过去,便有结论出来了。教师总结:这种方法叫顺序比较法,可以达到目的,但是程序的复杂度比较高,比如说有1000人或者有10000人或者更多的话,这种方法就体现不出优越性了。如何更快更简便地得到结论呢?这时教师引入二分法的思想:从10个中找出中间位置的一位同学与X 进行比较。有三种结论:1、若相等则表示找到,停止程序。2、若比X高,那么与X等高的得在中间往后的这部分人中找。3、若比X低,那么与X等高的得在中间往前的这部分人中找。在2或3 中又重复同一过程。
第三步:游戏分进行3次
第一次游戏选择一个学生X,其身高与九号学生刚好相同(假设不知道)游戏过程如下:
1号 2号 3号 4号 5号 6号 7号 8号 9号 10号
队首:1号
队尾:10号
找到中位置MID=(1+10)\2=5号
因为X>5号所以只能舍弃前半部分,在后半部分找,于是只剩下
6号 7号 8号 9号 10号
队首:6号
队尾:10号
找到中间位置:
MID=(6+10)\2=8 号
因为X>8号所以只能舍弃前半部分,在后半部分找,于是只剩下
9号 10号
队首:9号
队尾:10号
找到中间位置:MID=(9+10)\2=9号
因为X=9号,找到。停止寻找。
在这轮游戏中可以发现从第二次开始每次的队首都是前一次求得的中间值加1得到的。也可理解为从中间一项往后开始下一次寻找。
第二次游戏:假设X的身高小于所有队列中的同学
1号 2号 3号 4号 5号 6号 7号 8号 9号 10号
队首:1号
队尾:10号
找到中位置MID=(1+10)\2=5号
因为X<5号所以要舍弃中间往后的部分,在前半部分找,于是剩下:
1号 2号 3号 4号
队首:1号
队尾:4号
找到中位置MID=(1+4)\2=2号
因为X<2号所以要舍弃中间往后的部分,在前半部分找,于是剩下:
1号
队首:1号
队尾:1号
找到中间位置:MID=(1+1)\2=1号
因为X<1号,所以要舍弃中间往后的部分,在前半部分找,而前面已无学生了,也就是说在队列中找不到与X相同身高的学生.。若按照前面的方法,可得如下的结论:
队首:1号
队尾:—1号
因为队列中最小是1号,最大是10号,不存在—1,可见出列了,也可知队列中没有与X 身高相同的同学。
由上可见,从第二次开始,每次队尾的值都是前一次的中间值减1得到的,而当队尾小于队首时即可知X不在队列中。
第三次游戏:假设X比队列中的任何一位同学都要高。
1号 2号 3号 4号 5号 6号 7号 8号 9号 10号
队首:1号
队尾:10号
找到中位置MID=(1+10)\2=5号
因为X>5号所以要舍弃中间往前的部分,在后半部分找,于是剩下:
6号 7号 8号 9号 10号
队首:6号
队尾:10号
找到中位置MID=(6+10)\2=8号
因为X>8号所以要舍弃中间往前的部分,在后半部分找,于是剩下:
9号 10号
队首:9号
队尾:10号
找到中位置MID=(9+10)\2=9号
因为X>9号所以要舍弃中间往前的部分,在后半部分找,于是剩下:
10号
队首:10号
队尾:10号
找到中位置MID=(10+10)\2=10号
因为X>10号所以要舍弃中间往前的部分,在后半部分找,而后面已无学生了,也就是说在队列中找不到与X相同身高的学生.。若按照前面的方法,可得如下的结论:
队首:11号
队尾: 10号
因为队列中最小是1号,最大是10号,不存在11号,可见出列了,也可知队列中没有与X 身高相同的同学。
由上可见,从第二次开始,每次队首的值都是前一次的中间值加1得到的,而当队尾小于队首时即可知X不在队列中。
游戏结束,引导学生总结:在三次游戏中,反复做的事情是什么?即:(1)如何找到中间的一位同学(2)找到后与X进行比较。有三种结果:相等,大于,小于。如何相应地去处理。(3)找到何时停止。即可以寻找的条件。通过第二、第三个游戏可以得出结论:当表示头部的号大于表示尾部的号时,停止寻找,得出找不到的结论。也就是说当头部号小于尾部号时可以去寻找。
由上面的分析可以得到以下的程序:
CLS
M=1 :N=10 (由M,N来代表头部及尾部的号)
DIM A(10) (由10个数组元素来存放1号到10号的身高)
INPUT X
F=0
DO WHILE M<=N AND F=0
MID = (M+N)\2
I F X= A(MID) THEN F=1 :EXIT DO
IF X<A(MID) THEN N = MID —1
IF X>A(MID) THEN M=MID +1
LOOP
IF F=1 THEN PRINT MID ELSE PRINT “没找到”
END
四、总结
通过这样的教学过程,让学生参与其中,体验过程,分析原因,得出结论。这样的过程有利于学生深刻体会算法思想,理解程算法思想,从而能触类旁通,举一反三。只有学习过程不再枯燥无味,才能激发学生学习的主动性与积极性。才能达到事半功倍的效果。