这是一道 Google 面试题,考察的是对于 粗调 和 精调 工程思维
对于扔鸡蛋/玻璃球。
ta不用您有什么基础,只需要一个基本工程思维。粗调和精调,这个已是统计学里最优法,所以不用担心复杂度,精力应放在怎么设计更好的粗调和精调方法,以减少次数。
那么,什么是 粗调和精调 呢??
比如,您学过机械去调一个数控机床的 20.0008 刁钻的值给您考试。也如,您拿着望远镜看海的另一边,要调到 20.0008 ,最是把时晴朗时浩渺时纯净时辽远的远方看的清楚。
第一个是粗调,您得大致对准20,第二个是精调,您能对准00008【手术机器人同理】。
本质 :设计各种粗调和精调的方法。
一大波思维修炼来袭:
给你两个一模一样的玻璃球。这两个球如果从一定高度掉到地上就会摔碎,当然,如果在这个高度以下往下扔,怎么都不会碎,超过这个高度肯定就一次摔碎了。
现在已知这个恰巧摔碎的高度范围在1层楼到100层楼之间。如何用最少的试验次数,用这两个玻璃球测试出玻璃球恰好摔碎的楼高。
为了便于你理解这道题,我不妨讲两个具体的策略。
第一个策略:是从第一层楼开始,一层一层往上试验。 你拿着球跑到第一层,一摔,没有碎,接下来你又跑到第二层去试,也没有摔碎。你一层层试下去,比如说到了第59层摔碎了,那么你就知道它摔碎的高度是59层。这个策略能保证你获得成功,但显然不是很有效。
第二个策略:是预测一下,试一试, 你跑到30层楼一试,没有碎,再跑到80层楼一试,碎了。虽然你把摔碎高度的范围从1-100减小到30-80,但接下来你就犯难了,因为你就剩一个球了,再这样凭感觉做试验,可能两个球都摔碎了,也测不出想知道的高度。
这道题好的方法是什么呢?
-------------------------------------------------------------------------------------------------------------------------------------------------------
两个球,一个用来做粗调,一个用来做精调,具体做法是以下这样的。
一种符号正常思维的 粗调 设计方法是:
为了认第一个球和第二个球尝试次数尽可能均衡,做运算,100的平方根是10。
我们次数 每 10 层扔一个玻璃球[10,20,...,90,100],
第9个时,次数是 1(第10层) + 9(第9个) = 18
最坏的次数是 10(第100层) + 9(第99个) = 19
想想,还可以减少嘛~ 进Google可不容易哦。
可以指出,这里的起始层可以是 第15层,依然每10层叠[15,25,...,85,95],
第14个时,次数是 1(第15层) + 14(第14个) = 14
最坏的次数是 9(第100层) + 9(第99个) = 18
----------------------------------------------------------------------------------------------------------------------------------------------
想想,还可以减少嘛~ 进Google可不容易哦
为了设计更好的 粗调 和 精调 算法, 我们可以反过来想。
假设最优尝试次数是 n 次,那么我们就从 n 层开始扔。
if ( 第一个鸡蛋碎了 ){ // 尝试次数为 n , 第 n 层扔
第二个鸡蛋从第1层开始,一层一层尝试,至 n - 1 层。( n - 1 ) + 1 = n, 满足最优次数
}else{ // 尝试次数为 n - 1 ,第 n + (n - 1) 层扔
楼层变成 100 - n 层 , 因为总·尝试次数 = n - 1 ,所以扔的绝对楼层是 n + ( n - 1 ) 层
同理得,如果接着扔玻璃球没碎,总·尝试次数 = n - 2 , n - 3 , ... ;
列出方程: x + (x-1) + (x-2) + ... + 1 = 100
方程左边 x + (x-1) + ... + 1 尝试 x 次即为 x 项,右边 100 即总的楼层数。
这是一个等差数列,可以转化为 (x + 1) * x / 2 = 100
下面给出证明过程:
Sn = a1 + a2 + a3 + ... + an ①
依据此式 ① , 可分成俩个方程
Sn = a1 + (a2+d) + (a3+2d) + ... + an+(n-1)d
Sn = an + (an-d) + (an-2d) + ... + an-(n-1)d
相加解得: Sn = x·(a1+an) / 2 等同 (x + 1) * x / 2 = 100, 公差d = 1, a1 = x, an = 1, Sn = 100;
(x + 1) * x / 2 = 100 解得 x = 14; ( x 向上取整 )
所以,最优解的最坏情况的尝试次数是 14 次,第一次扔玻璃球的楼层也是 14 层。
14, 27, 39, 50, 60, 69, 77, 84, 90, 95, 99, 100
okok, 举个例子~
假设玻璃球不会碎的临界点是 98 层,于是扔玻璃球的过程:
1: 14
2: 27
3: 39
4: 50
5: 60
6: 69
7: 77
8: 84
9:90
a: 95
b: 96
c: 97
d: 98
一共 14 次,等于 假设的最优解的最坏次数,测试多次后,发现恒成立。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
想想,还可以减少嘛~ 进Google可不容易哦
想一想,给你三个玻璃球,你咋分???
利用好 粗调 和 精调 的工程思维。