让我们使用决策树解决经典的“假硬币”难题。以下是谜题的两种不同变体。我提供以下两个难题的描述,尝试自己解决,假设N = 8。
简易:给定两个平底锅公平的余额和N个外观相同的硬币,其中只有一个硬币较轻(或更重) 。为了弄清楚奇数硬币,在最坏的情况下需要多少个最小称量数?
困难:给定一个两个公平的平衡和N相同看着硬币其中只有一枚硬币米AY是有缺陷的。在最坏的情况下,如何通过最少的试验次数来找出哪个硬币(如果有)是奇数,又如何确定它是较轻还是较重?
让我们从相对简单的示例开始。阅读完每个问题后,请尝试自行解决。
问题1 :(简单)
给定5个硬币,其中较轻的一个硬币。在最坏的情况下,算出奇数硬币需要最少称量多少个?
将硬币命名为1、2、3、4和5。我们知道一枚硬币较轻。考虑到最佳平衡,我们可以用两种不同的方式对硬币进行分组,[(1、2),(3、4)和(5)]或[(12),(34)和(5)]。我们可以轻松排除诸如[(123)和(45)]之类的组,因为我们会得到明显的答案。任何其他组合都将属于这两个组之一,例如[(2)(45)和(13)]等。
考虑第一组,对(1、2)和(3、4)。我们可以检查(1,2),如果它们相等,则继续(3,4)。在最坏的情况下,我们需要两个称重。当硬币较重时,可以使用相同的类比。
对于第二组,分别称重(12)和(34)。如果它们的平衡(5)是有缺陷的,则选择较轻的一对,我们需要再称重一下才能找到奇数。
在5个硬币的情况下,两种组合都需要两个称重,而一个硬币的先验信息更轻。
分析:通常,如果我们知道硬币是重的还是轻的,我们可以在对数3 (N)次试验中对硬币进行追踪(四舍五入到下一个整数)。如果我们将平衡的结果表示为三叉树,则每片叶子都表示结果。由于N个硬币中的任何一个硬币都可能是有缺陷的,因此我们需要获得一个具有最少N个叶子的三元树。第k级的三叉树将有3 k叶,因此我们需要3 k > =N。
换句话说,在k次试验中,如果我们知道有缺陷的硬币是重的还是轻的,我们最多可以检查3 k个硬币。假设硬币较重,请验证3次试验足以在12个硬币中找到奇数硬币,因为3 2 <12 <3 3 。
问题2 :(困难)
我们给出4枚硬币,其中只有一枚硬币马y为有缺陷的。我们不知道所有硬币都是真硬币还是存在缺陷硬币。在最坏的情况下,需要多少个称重才能找出奇数硬币(如果存在)?我们还需要告诉它是较重还是较轻。
通过以上分析,我们可以认为k = 2次试验就足够了,因为两级三元树可产生9片叶子,大于N = 4(再次阅读问题)。注意,两次称重不可能解决上述4个硬币的问题。决策树确认事实(尝试绘制)。
我们可以用两种不同的方式对硬币进行分组,即[(12,34)]或[(1,2)和(3,4)]。让我们考虑组合(12、34),下面给出相应的决策树。蓝色的叶子是有效的结果,红色的叶子是不可能的情况。由于在此之前的假设,我们得出了不可能的情况。
结果可以是(12)<(34),即我们继续到左子树或(12)>(34),即我们继续到右子树。
左子树有两种可能,
- A)1或2可以更轻或
- B)3或4可能会更重。
进一步在左侧子树上,作为第二次试验,我们权重为(1、2)或(3、4)。让我们考虑(3,4),因为(1,2)的类比是相似的。第二步的结果可以是三种方式
- A)(3)<(4)产生4作为有缺陷的较重硬币,或
- B)(3)>(4)产生3作为有缺陷的较重硬币或
- C)(3)=(4),产生歧义。在这里,我们需要再称重一下以检查1或2的真硬币。在图中,我取了(3,2),其中3被确认为真硬币。我们可以得到(3)>(2),其中2较轻,或者(3)=(2),其中1较轻。注意,不可能得到(3)<(2),这与我们偏向左侧的假设相矛盾。
同样,我们可以分析正确的子树。我们还需要在正确的子树上再进行两次加权。
总体而言,我们需要进行3次称量才能追踪奇数硬币。请注意,我们无法利用三叉树的两个结果。此外,该树不是全树,中间分支在第一次称重后终止。实际上,我们可以获得27个3级完整三叉树的叶子,但只有11个叶子,包括不可能的情况。
分析:给定N个硬币,所有硬币可能都是真实的,或者只有一个硬币有缺陷。我们需要一个决策树,其中至少有(2N +1)个叶子对应于输出。因为可以有N片较轻的叶子,或者N片较重的叶子或一种真正的箱子,所以总共有(2N +1)片叶子。
如前所述,在级别k上的三叉树最多可以有3 k个叶子,我们需要一棵叶子为3 k >(2N +1)的树。
换句话说,我们需要至少k> log 3 (2N +1)权重才能找到有缺陷的1。
观察上图,并非所有分支都在生成叶子,即我们缺少某些分支下的有效输出,从而导致更多的试验。在可能的情况下,我们应该对硬币进行分组,以使每个分支都可以产生有效的输出(简单地说,就是生成完整的三进制树)。问题4描述了这种使用12个硬币的方法。
问题3 :(两个锅秤的特殊情况)
我们给了5个硬币,一组4个硬币,其中一个硬币有缺陷(我们不知道它是较重还是较轻),而一个硬币是真品。在最坏的情况下,需要多少个称重才能弄清奇怪的硬币(更重或更轻)?
将硬币分别标记为1、2、3、4和G(正品)。我们现在掌握了一些有关硬币纯度的信息。我们需要在分组中使用它。
我们最好将它们分组为[(G1,23)和(4)]。任何其他小组都无法生成完整的三进制树,请尝试一下。下图说明了该过程。
中例(G1)=(23)是不言而喻的,即1、2、3是真品,而第四枚硬币可以在另外的一次试验中算得更轻或更重。
树的左侧对应于情况(G1)<(23)。这有两种可能,要么1应该更轻,要么(2,3)应该更重。当下一个称重(2,3)达到平衡时,前者很明显,重量减轻了1。后面的情况可能是(2)<(3)产生3较重或(2)>(3)产生2较重。命名左分支上的叶节点以反映这些结果。
树的右侧对应于情况(G1)>(23)。这有两种可能,要么1较重,要么(2,3)较轻。当下一个权重(2,3)达到平衡时,前者很明显,得出的权重为1。后一种情况可能是(2)<(3)产生2较轻的硬币,或(2)>(3)产生3较轻的硬币。
在上述问题中,在任何可能的情况下,我们仅需要两次称重。我们能够使用两级完整三元树的所有结果。我们从(N + 1)= 5个硬币开始,其中N = 4,最后我们得到(2N +1)= 9个叶子。实际上,自从我们盯着5个硬币以来,我们应该有11个结果,其他2个结果又在哪里呢?这两个结果可以在树本身的根部声明(在第一次称重之前),您能确定这两个结果是正确的吗?
如果我们观察该图,则在第一次称重之后,问题就减少为“我们知道三枚硬币,其中一个可以更轻(更重),或者另外两个可以更重(更轻)”。这可以通过一次称重来解决(请参阅问题1)。
分析:给定(N + 1)个硬币,一个是真实的,其余N个可以是真实的,或者只有一个硬币有缺陷。所需的决策树应导致最少(2N +1)个叶子。由于总的可能结果为(2(N +1)+1),因此权重(试验)的数量由三叉树的高度给出,k> = log 3 [2(N +1)+1]。注意等号。
重新排列k和N,我们可以在k次试验中称重N <=(3 k – 3)/ 2个硬币的最大值。
问题4 :(经典的12个硬币拼图)
您将获得两个泛公平的平衡。您有12个外观相同的硬币,其中一个硬币可能更轻或更重。在最低限度的试验中,如何找到奇异的硬币(如果有的话),还可以确定有缺陷的硬币是更轻还是更重(在最坏的情况下)?
您想如何将它们分组?两件套还是三件套?显然,我们可以放弃分成两个相等组的选择。它不能导致最好的树。从以上两个示例中,如果我们可以揭示至少一个真正的硬币,则可以确保决策树可以以最佳方式使用。请记住对硬币进行分组,以使第一次称重至少可以显示一个真正的硬币。
让我们将硬币命名为1、2,…,8,A,B,C和D。我们可以将硬币分为3组,即(1234),(5678)和(ABCD)。称量(1234)和(5678)。鼓励您在阅读程序时画出决策树。结果可以是三种方式,
- (1234)=(5678),两组相等。硬币缺陷可能属于(ABCD)组。
- (1234)<(5678),即第一组的体重小于第二组。
- (1234)>(5678),即第一组的体重比第二组重。
输出(1)可以解决问题3中给出的两个锅秤的特殊情况,再用两个称重来解决。我们知道(1234)和(5678)组是真实的,并且有缺陷的硬币可能位于(ABCD)中。从任何一个加权组中选择一个真正的硬币,然后按照问题3中的说明进行(ABCD)。
结果(2)和(3)很特殊。在这两种情况下,我们都知道(ABCD)是真实的。而且,我们知道一组硬币较轻,一组硬币较重。我们需要以这样一种方式将加权后的两组进行混洗,以使最终得到较小的高度决策树。
考虑第二个结果,其中( 1234 )<( 5678 )。 (1、2、3、4)中的任何硬币较轻或(5、6、7、8)中的任何硬币较重是可能的。首次称重后,我们发现了轻或更重的可能性。如果我们按照问题1的顺序进行,则不会生成最佳决策树。让我们将硬币( 123 5 )和( 4 BCD)作为新的组进行洗牌(可能会有不同的洗牌,它们也导致最小的称量)。如果我们再次对这两个组进行加权,则结果可能是三种方式:i)( 123 5 )<( 4 BCD)产生1,2,3中的一个更轻,类似于上述问题1,我们需要再加权一次, ii)( 123 5 )=( 4 BCD)产生6,7,8中的一个较重,这与上述问题1类似,我们需要再称重iii)( 123 5 )>( 4 BCD)产生5中的一个较重的硬币或较轻的硬币4个,但又要损失一重。
同样,我们也可以在另外两个权重中求解正确的子树(第三个结果,其中( 1234 )>( 5678 ))。
在最坏的情况下,我们能够以3磅的重量解决12个硬币难题。
几个有趣的难题:
- 用N = 8和N = 13来解决问题4,每种情况下需要多少次最少试验?
- 给定一个函数int weight(A [],B []) ,其中A和B是数组(不需要相等的大小)。该函数返回-1、0或1。如果A和B中所有元素的总和相等,则返回0;如果A B则返回1。给定一个包含12个元素的数组,除了所有元素外,其他元素均相等一。奇数元素可以与其他元素一样,小于或大于其他元素。编写一个程序,使用最少的weight()次来查找奇数元素(如果有)。
- 在上学期间,您可能已经在科学实验室中看到了3分平衡。假设有3个平底锅(4个结局)和N个硬币,那么需要多少次最低限度的试验才能找出奇数硬币?
参考:
“ Levitin算法简介”一书的练习中也提供了类似的问题。具体阅读第5.5节和第11.2节(包括练习)。