12球问题/12硬币问题通解,以及引申的决策树/最优三叉树算法
2015-08-28 19:21
411 查看
问题:“有十二个外表相同的球,其中有一个坏球,它的重量和其它十一个有轻微的(但是可以测量出来的)差别。现在有一架没有砝码的很灵敏的天平,问如何称三次就保证找出那个坏球,并知道它比标准球重还是轻。”
硬币问题与此类似,换汤不换药,本质一样。
先从最一般的认知思维来解决这个问题,下面的思路只能找到问题球而不能完全确定是比标准球轻还是重,因为博客不好编辑,我另外写好截了个图:
(看不清可以右键在新页面中打开)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201508/e2e3c90e35ee9d7055d15006bd254e23)
球数很少时这样算也勉强可行,如果是2000个球应该怎样解决呢?
于是自然就引申到了求这个问题的一般解的高度上。
最终结论 ———对于N个求需要称球的次数是:[ log3(2N)] 向上取整数
这里有兴趣的可以看看另外一位博友的详细数学推理证明过程:
推理证明
硬币问题与此类似,换汤不换药,本质一样。
先从最一般的认知思维来解决这个问题,下面的思路只能找到问题球而不能完全确定是比标准球轻还是重,因为博客不好编辑,我另外写好截了个图:
(看不清可以右键在新页面中打开)
球数很少时这样算也勉强可行,如果是2000个球应该怎样解决呢?
于是自然就引申到了求这个问题的一般解的高度上。
最终结论 ———对于N个求需要称球的次数是:[ log3(2N)] 向上取整数
这里有兴趣的可以看看另外一位博友的详细数学推理证明过程:
推理证明
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例