1700414910
1700414911
图5.6 未使用哨兵的流程图
1700414912
1700414913
1700414914
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
[
上一页 ]
[ :1.70041491e+09 ]
[
下一页 ]