美文网首页程序员
谷歌面试题之-12球称重问题

谷歌面试题之-12球称重问题

作者: melo的微博 | 来源:发表于2018-06-30 14:20 被阅读318次

    导读: 12个外表一样的小球 其中11个球重量相同 1个球为[异常球] 可能重量比较重也可能比较轻 如何利用天平称重3次来找出这个[异常球]?

    本文作者为 简书-melo的微博 / 掘金-melo的微博 / Github-meloalright
    转载请注明出处哦。

    0.了解历史沿革

    称球问题是一个经典的数学问题
    理论上称球问题只要球的数量小于等于 (3^n − 3)/2 就一定可解

    维基百科的解释如下:

    称球问题 是指若在最多 (3^n − 3)/2 个球中有一个特殊球的重量与众不同(不知道偏重还是偏轻)
    而其他球的重量全部相同 则用无砝码的天平称n次可以找出特殊球 并确定特殊球是偏轻还是偏重
    如果有 (3^n − 1)/2 个球 则同样可以保证找出特殊球 但不一定能确定特殊球是偏轻还是偏重

    1.第一次称重

    1.分三组 {A1, A2, A3, A4} {A5, A6, A7, A8} {A9, A10, A11, A12}

    2.前两组称重 {A1, A2, A3, A4} --- {A5, A6, A7, A8}

    情况1: 左边重
    (ps:证明[异常球]在前两组8个球里 可能是第一组有球异常重-或者第二组有球异常轻)

    情况2: 右边重
    (ps:证明[异常球]在前两组8个球里 可能是第一组有球异常轻-或者第二组有球异常重)

    情况3: 平衡
    (ps:证明[异常球]在第三组4个球里)

    ps:如果[平衡]那就好说了 证明[异常球]在第三组的四个球{A9, A10, A11, A12}里 这种情况我们稍后再做分析

    ps:下面先介绍未平衡的复杂情况 以[情况1左边重]举例

    2.第二次称重

    0.声明: {A9, A10, A11, A12}都是[无辜球] 因为第一步已经确认[异常球]在前两组

    1.为前两组引入1个[无辜球]来分组 {A1, A2, A3, A4, A5, A6, A7, A8, 无辜} 现在有9个球

    2.再把9个球再分三组

    # 这里分组方法比较复杂
    
    >>> 这次3组的分组方式首先为
    '''
    
    
     {A1, A2, A3}         {A5, A6, 无辜} -----
     /    |    \          /    |              \
    {A1,  A2,  A3,  A4,  A5,  A6,  A7,  A8,  无辜}
                     \             |    /
                      --------{A4, A7, A8}
    
    '''
    >>> 我们看到[原先的第一组]去掉了{A4} [原先的第二组]去掉了{A7}{A8} 
    >>> 去掉的这3个球组成了第三组{A4, A7, A8}
    >>> 第二组则补上了一个[无辜球]
    >>> 目前得到的3个分组为
    >>> {A1, A2, A3}
    >>> {A5, A6, 无辜}
    >>> {A4, A7, A8}
    
    >>> 然后再让前两组的{A2}和{A6}互相交换
    >>> 我们称之为[叛变球]
    '''
    {A1, A2, A3}  
         ^|
         |v
    {A5, A6, 无辜}
    '''
    >>> 最终的3个分组为
    >>> {A1, A6, A3}
    >>> {A5, A2, 无辜}
    >>> {A4, A7, A8}
    

    3.把前两组称重 {A1, A6, A3} --- {A5, A2, 无辜}

    情况1: 发生反转 右边重
    (ps:证明[异常球]还在前两组中 而且就在[叛变球]-{A2}和{A6}中)

    情况2: 还是 左边重
    (ps:证明[异常球]还在前两组中 而且在这两次称重都没动位置的{A1}{A3}{A5}中)

    情况3: 平衡
    (ps:证明[异常球]在第三组{A4, A7, A8}中)

    ps:如果是[发生反转]那就好说了 证明异常球在[叛变球]-{A2}和{A6}中 这种情况我们稍后再做分析

    ps:如果是[左边重] 证明了相比[第一次称重结果] 去掉{A4, A7, A8}和叛变{A2}与{A6}都不能改变左边重的这个结果 所以异常球一定在这两次称重都没动位置的{A1}{A3}{A5}中 一定是{A1}{A3}其中一个异常重-或者{A5}异常轻

    ps:[左边重]和[平衡]的接下来处理方案其实是思路一样的 我们以[情况2左边重]为举例继续

    3.第三次称重

    0.声明:异常球一定在{A1}{A3}{A5}中 一定是{A1}{A3}其中一个异常重-或者{A5}异常轻

    1.直接{A1}和{A3}互相称重一下

    情况1: {A1}重
    (ps:答案已找到 => {A1}是异常球 重量异常重)

    情况2: {A3}重
    (ps:答案已找到 => {A3}是异常球 重量异常重)

    情况3: 平衡
    (ps:答案已找到 => {A5}是异常球 重量异常轻)

    ps:答案已找到

    4.其他情况同理

    2.2-本文在[第一次称重]未详细分析的[情况2右边重]情况同样可以以同一思路解决
    2.3-本文在[第一次称重]未详细分析的[情况3平衡]情况 可得知[异常球]在{A9, A10, A11, A12}当中 可以在[第二次称重]将{A9, A10}与{A11, 无辜}互相称重 若[平衡]就好说了 直接得知[异常球]是{A12} 若[左边重]则可能{A9, A10}存在[异常球]且异常重-或{A11}为异常球且异常轻 接下来[第三次称重]以上文同一思路解决即可
    3.1-本文在[第二次称重]未详细分析的[情况1发生反转]情况 可得知[异常球]在{A2}或{A6}当中 可得知可能{A2}为异常球且异常重-或者{A6}为[异常球]且异常轻 接下来[第三次称重]直接取任意[无辜球]与{A2}称重即可得知答案
    3.3-本文在[第二次称重]未详细分析的[情况3平衡]情况 可得知{A4, A7, A8}为[异常球] 并对比[第二次称重]结果可知 可能{A4}为[异常球]且异常重-或{A7}{A8}存在[异常球]且异常轻 接下来[第三次称重]以上文同一思路解决即可

    5.题外话

    关于这道题的可解性: 有一个信息熵的解释大家可以看下

    其中12个球找到异常球的信息熵是 log(12)
    找到异常球后得知轻重信息的信息熵是 log(2)
    所以问题的总信息熵是 log(12) * log(2) = log(24)

    每次称重包含左-右-平衡三种情况 所以每次称重的信息熵是 log(3)
    3次称重的总信息熵是 log(3) * 3 = log(27)

    因为: log(27) > log(24)
    所以: 3次称重内一定可解

    结语:

    本文的12球称重问题就分析到这里啦
    (∩_∩)求点赞求关注哦

    鸣谢:

    参考文档:
    称球问题 - 维基百科
    12球称重问题 - CSDN博客
    n铁球称重问题 - 知乎

    相关文章

      网友评论

        本文标题:谷歌面试题之-12球称重问题

        本文链接:https://www.haomeiwen.com/subject/gmstuftx.html