扔鸡蛋/玻璃球[Google面试题-解析]

版权声明:Hi,I m Debroon【Q:23609099,青睐互动 https://blog.csdn.net/qq_41739364/article/details/86751704

这是一道 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可不容易哦

想一想,给你三个玻璃球,你咋分???

利用好 粗调 和 精调 的工程思维。

猜你喜欢

转载自blog.csdn.net/qq_41739364/article/details/86751704