在N个硬币中找到假币的算法

Algorithm to find counterfeit coin amongst n coins

所以这是一个经典的问题,在一组硬币中找到一个伪造的硬币,只用一个天平。为了完整性,下面是这样一个问题的例子:

A well-known example has nine (or fewer) items, say coins (or balls), that are identical in weight save for one, which in this example is lighter than the others—a counterfeit (an oddball). The difference is only perceptible by weighing them on scale—but only the coins themselves can be weighed. Is it possible to isolate the counterfeit coin with only two weighings?

我们正在处理的情况是,只有一枚硬币是伪造的,我们知道它是如何伪造的(即,我们知道它更重/更轻)。

我的问题是,有没有一个通用的有效算法来解决这个问题的广义版本的N硬币与一个假币。我一直在想,到目前为止,如果N的形式是3^k,那么你可以通过递归地将它们分成三组来找到?log_3_(N)?中的伪品。这对所有的N来说都是真的吗,而不仅仅是来自江户的那些(2),如果是的话,我们能做得更好吗?


让我们说,你有N个硬币。

制作3组硬币,每组包含地板(n/3)硬币。如果有剩余的硬币(n%3),将它们放在最后一组(第三组)。注意前两组硬币的数量相同。

将第一组与第二组称重。如果他们是不平等的,那么我们必须从其中一个群体中找出罪犯(假币)。所以我们的解决方案空间在第一次称重后减少到n/3。

如果它们相等,那么第三组中的假币最多有(n/3)+2枚。

递归地这样做,让我们在CEIL(Log_3_uu(n))时间中找到伪代码。


除非您对输入有任何额外的信息,否则?log_3_(N)?是您能达到的最好的方法。三组相等数量的硬币,两组硬币相对重量,你会看到三组硬币中哪一组的重量较低。递归地对最轻的组应用相同的算法。任何遗留在k^3上的钱币也会保留以备日后使用。


我已经使用了这个代码,但是有时它被关闭了1((:

1
2
3
4
5
6
7
8
9
10
11
def how_many_measurements(n):
    import math
    if n<2:
        x = 0
    elif n >= 2 and n<=4:
        x = 1
    elif n>4 and n<12:
        x = 2
    else:
        x= math.ceil(math.log((2*n+1),3))
    return x