根据问题选择N分法再看看称球问题

前面用猜数字游戏说明了二分的思想,这里再看一个常见的思维题:皇家娱乐城

12个小球,其中有一个是坏球。有一架天平。需要你用最少的称次数来确定哪个小球是坏的并且它到底是轻还是重。

这个问题是一道流传已久的智力题。网络上也有很多讲解,还有泛化到N个球的情况下的严格证明。也有零星的一些地方提到从信息论的角度来看待最优解法。本来我一直认为这道题目除了试错之外没有其它高妙的思路了,只能一个个方法试,并尽量从结果中寻找信息,然后看看哪种方案最少。

然而,实际上它的确有其它的思路,一个更本质的思路,而且根本用不着信息论这么拗口的知识。

我们先回顾一下猜数字游戏。为了保证任何情况下以最少次数猜中,我们的策略是每次都排除恰好一半的可能性。类比到称球问题上:

  • 坏球可能是12个球中的任意一个,这就是12种可能性。
  • 而其中每种可能性下坏球可能轻也可能重。于是“坏球是哪个球,是轻是重”这个问题的答案就有12×2=24种可能性。

现在我们用天平来称球,就等同于对这24种可能性发问,由于天平的输出结果有三种“平衡、左倾、右倾”,这就相当于我们的问题有三个答案,即可以将所有的可能性切成三份,根据猜数字游戏的启发,我们应当尽量让这三个分支概率均等,即平均切分所有的可能性为三等份。如此一来的话一次称量就可以将答案的可能性缩减为原来的1/3,三次就能缩减为1/27。而总共才有24种可能性,所以理论上是完全可以3次称出来的。

如何称的指导原则有了,构造一个称的策略就不是什么太困难的事情了。

首先不妨解释一下为什么最直观的称法不是最优的——6、6称:在6、6称的时候,天平平衡的可能性是0。刚才说了,最优策略应该使得天平三种状态的概率均等,这样才能三等分答案的所有可能性。

为了更清楚的看待这个问题,我们不妨假设有6个球,来考虑一下3、3称和2、2称的区别:

在未称之前,一共有12种可能性:1轻、1重、2轻、2重、…、6轻、6重。

3、3称:现在将1、2、3号放在左边,4、5、6放在右边3、3称了之后,不失一般性假设天平左倾,那么小球的可能性就变成了原来的一半(6种):1重、2重、3重、4轻、5轻、6轻。即这种称法能排除一半可能性。

2、2称:现在再来看2、2称法,即1、2放左边,3、4放右边,剩下的5、6不称,放一边。假设结果是天平平衡,那么可能性剩下——4种:5重、5轻、6重、6轻。假设天平左倾,可能性也剩下4种:1重、2重、3轻、4轻。右倾和左倾的情况类似。总之,这种称法,不管天平结果如何,情况都被我们缩小到了原来的三分之一!我们充分利用了“天平的结果状态可能有三种”这个条件来三等分所有可能性,而不是二等分。

说到这里,剩下的事情就实在很简单了:第二步称法,只要记着这样一个指导思想——你选择的称法必须使得当天平平衡的时候答案剩下的可能性和天平左倾(右倾)的时候答案剩下的可能性一样多。实际上,这等同于你得选择一种称法,使得天平输出三种结果的概率是均等的,因为天平输出某个结果的概率就等同于所有支持这个结果(左倾、右倾、平衡)的答案可能性的和,并且答案的每个可能性都是等概率的。

MacKay在他的书《Information Theory: Inference and Learning Algorithms》(作者开放免费电子书)里面4.1节专门讲了这个称球问题,还画了一张不错的图,我就照抄了:

图中“1+”是指“1号小球为重”这一可能性。一开始一共有24种可能性。

4、4称了之后不管哪种情况(分支),剩下来的可能性总是4种。这是一个完美的三分。

然后对每个分支构造第二次称法,这里你只要稍加演算就可以发现,分支1上的第二次称法,即“1、2、6对3、4、5”这种称法,天平输出三种结果的可能性是均等的(严格来说是几乎均等)。这就是为什么这个称法能够在最坏的情况下也能表现最好的原因,没有哪个分支是它的弱点,它必然能将情况缩小到原来的1/3。

时间: 2024-08-07 08:22:28

根据问题选择N分法再看看称球问题的相关文章

搜达五分法:瑞士期待复仇法兰西

两支球队在首场小组赛中都全取3分,为小组出线奠定了不错的基础.对于瑞士队来说,首场能够拿下厄瓜多尔虽说结果令人满意但是过程却有些幸运的味道,所以全队并不能掉以轻心.就像在上届世界杯赛中那样,首轮在战胜西班牙的大好局面下,后两场比赛没能把握住机会惨遭淘汰.本场对阵法国,瑞士首要的任务还是做好防守,选择他们比较擅长的防守反击战术,即便不能取胜,打平也是一个不错的结果.而对于法国队来说,首场大胜洪都拉斯,次战瑞士当网络pos机然想取得2连胜尽早确定出线资格. 搜达五分法:瑞士期待复仇法兰西,布布扣,b

uitableView 选择跳转后 再跳回来 颜色不变 问题

今天遇见过这个问题  以前都没这方面需求所以没有遇见 今天遇见了 网上查了 没有查到 好吧 只能说自己的问题 但是 还好kai哥到 一句话就解决了 ! 就是在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath中反选回来 如下代码: - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(

PHP--冒泡、选择、插入排序法

使用php来实现常用三种排序方法: 1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: xxx 5 * Date: 2016/10/12 6 * Time: 21:38 7 */ 8 // 冒泡排序法 9 function maopao_sort(&$arr){ 10 // 外循环 控制趟数 只需要count($arr)-1趟就可以完成排序 11 for($i=0;$i<count($arr)-1;$i++){ 12 // 内循环控制每一趟

选择法和冒泡法排序接口

#define ret_ok 0 #define ret_err 1 #define ARRAY_SIZE 10 /*选择法排序*/ int Choice_Sort(int array[],int array_len) { int i = 0; int j = 0; int iMin = 0; int iTemp = 0; int iFlag = 0; for(i=0;i<array_len-1;i++) { iMin = i; for(j=i+1;j<array_len;j++) { if(

Hive里的分区和分桶再谈

 分桶是细粒度的,分桶是不同的文件. 分区是粗粒度的,即相当于,表下建立文件夹.分区是不同的文件夹. 桶在对指定列进行哈希计算时,会根据哈希值切分数据,使每个桶对应一个文件. 里面的id是哈希值,分过来的. 分桶,一般用作数据倾斜和数据抽样方面.由此,可看出是细粒度. Hive 中创建分区表没有什么复杂的分区类型(范围分区.列表分区.hash 分区,混合分区等).分区列也不是表中的一个实际的字段,而是一个或者多个伪列.意思是说,在表的数据文件中实际并不保存分区列的信息与数据. 注意:普通表(外部

例题:青歌赛打分程序。去掉两个最高分,去掉两个最低分,再算平均分。主要学习数组和冒泡排序,什么情况下要定义数组

Console.Write("请输入评委人数:");//输入人数 int renshu = Convert.ToInt32(Console.ReadLine());//人数代入 int[] fenshu = new int[renshu];//定义一个分数的数组,长度为人数 if (renshu >= 5)//去掉连个最高分,去掉两个最低分,所以至少五个人 { for (int i = 0; i < renshu; i++) { Console.Write("请输

《University Calculus》-chape5-积分法-微积分基本定理

定积分中值定理: 积分自身的定义是简单的,但是在教学过程中人们往往记得的只是它的计算方法,在引入积分的概念的时候,往往就将其与计算方法紧密的捆绑在一起,实际上,在积分简单的定义之下,微积分基本定理告诉了我们积分的计算方法. 微积分基本定理: 能够看到,正是基于这样一个基本定理,我们才能够找到积分的计算方法,从这个角度就可以充分的理解为什么求积分的过程实际上是一个求“反导数”(求导的逆运算)的过程了.

40斤西瓜3人分,求分法

该题最核心的思路是西瓜一共40斤,只要3个人分到的西瓜斤数总和等于40即可,所以,即有如下解决方法: <?php $aa = range(1,40); $bb = array(); foreach($aa as $k=>$val){   foreach($aa as $v){     foreach($aa as $vl){       $sum = $val+$v+$vl;       if($sum == 40){         $bb[$k][0] = $val;         $b

选择式排序法之选择排序法实现 -java版

计算算法时间复杂度比冒泡快一点 选择排序法核心思想是,第一次从R[0] ~R[n-1]中选择最小值然后与R[0]交换,第二次从R[1] ~R[n-1]中选取最小值与R[1]交换---第i次呢就是从R[i-1] ~R[n-1]中选取最小值,与R[i-1]元素交换:对于一个含有n个元素的数组,最多交换n-1次就得到了一个排序码从小到大的有序序列. package com.PengRong.A; import java.util.*; /** * * @author PengRong * */ pub