应用介绍
二分算法(Binary Search)是生活中非常常用的折半算法,能解决快速查找、快速定位的问题,主要用到数学和逻辑代码块。
本示例程序演示了采用普通遍历的方式和二分的方式分别需要几次能够猜中随机给出的数字。
二分算法(Binary Search)教程(难度系数:★★☆)
教程入口:App Inventor 2 中文网(fun123.cn) -> 登陆 -> “项目指南” -> 二分算法(BinarySearch)"开始学习"。
App基本逻辑设计
- 设计一个普通遍历算法,从 1 开始逐个往上猜,这也是最笨的一种方式,当然最终能够猜对,当随机数是100时,最多需要猜100次。
- 再设计一个二分算法,每次猜中间折半的结果,比如第一次猜50,如果小了则再猜75,如此直到不能再折半为止,也定能猜中。至于需要几次猜中,大家可以利用本示例程序进行验证,本教程最后会给出答案。
准备工作
- 界面简单布局,如下:
- 让App程序从 1 ~ 100 中随机生成一个数字,定义一个空列表,设置到“列表显示框”组件中:
普通遍历算法
普通遍历方式很简单,设计一个 1 ~ 100的循环,每次比对一下是否和上面的随机数相等,相等就是猜中了,就不用继续猜了。代码如下:
二分算法
二分方式代码如下:
原理示意图如下:
注意点:计算中间二分数字的时候,需要向下取整,否则计算出来的是小数,当然不是我们想要的,我们的前提是猜整数数字。
举个例子:
App随机给出的数字是17,我们依次猜的是:
- (1 +100)/2 = 50(大了) 1 50 100
- (1 +50)/2 = 25(大了) 1 25 50
- (1 +25)/2 = 13(小了) 1 13 25
- (13+25)/2 = 19(大了) 13 19 25
- (13+19)/2 = 16(小了) 13 16 19
- (16+19)/2 = 17(猜中) 16 17 19
开始测试
点击按钮开始测试,列表中会显示两种方式猜中需要的次数,二分的话还会输出每次猜的具体是哪个数字。
后记
测试下来,我们会发现,都是7次或7次之内就能猜中,其中的原理是什么呢?
算法复杂度是O(logN)。2^7 = 128 > 100,因此最多7次能猜中。大家可以思考并尝试一下将100改为1000,这时最多需要几次猜中?
不仅如此,在计算机科学中,二分算法(Binary Search)也是非常基础的算法,使用场景非常的多,有序表的检索、数据库索引技术等。