1700414915
1700414916
图5.6所示的过程,虽然看起来似乎没有什么问题,但实际上含有不必要的处理–每回都要检查箱子的编号有没有到100
1700414917
1700414918
为了消除这种不必要的处理,于是添加了一个101号箱子,其中预先放入的纸条上琯有正要查找的数字。这种数据称为“哨兵”,通过放入哨兵,就一定能找到要找的数据了。找到要找的数据后,如果该箱子的编号还没有到101就意味着找到了实际的数据;如果该箱子的编号是101,则意味着找到的是哨兵,而没有找到实际的数据。使用了哨兵的流程图如图5.7所示。
1700414919
1700414920
图5.7 使用了哨兵的流程图
1700414921
1700414922
1700414923
1700414924
1700414925
需要反复多次检查的就只剩下“第N个箱子中包含要找的数字吗?”这一点了,程序的执行时间也因此大幅度缩减了
1700414926
1700414927
当笔者第一次得知哨兵的作用时,对其巧妙性感到惊叹,兴奋异常。有些读者会感到“不太明白巧妙在哪里”,那么就讲一个故事来解释哨兵的概念吧。假设某个漆黑的夜晚,在海岸的悬崖边上玩一个游戏,站在距悬崖边缘100米的地方,地上每隔1米放置一个物品,请找出这些物品中有没有苹果。
1700414928
1700414929
每前进1米就要捡起地上的物品,检查是否是苹果,同时还要检查有没有到悬崖边缘(不检查的话有可能掉到海里)。也就是说要对这两种检查反复若干次。
1700414930
1700414931
使用了哨兵后,就要先把起点挪到距离悬崖101米的地方,再在悬崖边缘放置一个苹果(如图5.8所示)
1700414932
1700414933
图5.8 使用了哨兵的游戏
1700414934
1700414935
1700414936
1700414937
1700414938
这个苹果就是哨兵。每前进1米只需检查捡到的物品是不是苹果就可以了。如果捡到了苹果,只需站在原地再检查1米外的情况,如果还没有到悬崖边缘,就意味着找到了真正的苹果。如果捡到的是哨兵,说明已经到悬崖边缘了,而没有找到真正要找的苹果
1700414939
1700414940
1700414941
1700414942
1700414944
计算机是怎样跑起来的 5.7 要点6:找出数字间的规律
1700414945
1700414946
所有的信息都可以用数字表示–这是计算机的特性之一。因此,为了构造算法,经常会利用到存在于数字间的规律。例如,请思考一下判定石头剪刀布游戏胜负的算法,如果把石头、剪刀、布分别用数字0,1,2表示,把玩家A做出的手势用变量A表示,玩家B做出的手势用变量B表示,那么变量A和变量B中所存储的值就是这一个数中的某一个。请以此判断玩家A和B的输赢
1700414947
1700414948
如果算法没有使用任何技巧,也许就会通过枚举表5.2所列出的9(3*3)种组合来判定输赢吧。把这个表格转换成程序后就得到了代码清单5.4.可以看出这是一种冗长而双枯燥的判断方法(代码清单5.4和5.5列出的都只是程序的一部分,因此不能直接运行)
1700414949
1700414950
表5.2 判定石头剪刀布输赢的表
1700414951
1700414952
变量A的值 变量B的值 判定结果
1700414953
1700414954
0(石头) 0(石头) 平局
1700414955
1700414956
0(石头) 1(剪刀) 玩家A获胜
1700414957
1700414958
0(石头) 2(布) 玩家B获胜
1700414959
1700414960
1(剪刀) 0(石头) 玩家B获胜
1700414961
1700414962
1(剪刀) 1(剪刀) 平局
1700414963
1700414964
1(剪刀) 2(布) 玩家A获胜
[
上一页 ]
[ :1.700414915e+09 ]
[
下一页 ]