假硬币问题

时间:2011-07-13 18:07:12

标签: algorithm big-o

12个硬币(或大理石)的经典问题,其中一个是假的。假币假定比实际硬币轻。

有比较硬币(或大理石)的比例。

可以逐一进行比较并比较所有12个硬币。

使用Decrease By Factor算法可以更有效地完成它。这是将硬币堆叠除以2并比较尺度上的2个堆叠。

因子2减少的大O是log2n。

因子3(log3n)算法有效降低,但我还没有找到它。

如果有人解释它以及为什么效率更高,请告诉我。

2 个答案:

答案 0 :(得分:4)

这里的主要想法是在设置测试时使用更多的问题知识:如果你分成3个而不是两个堆栈并用其中两个堆栈(每个包含相同数量的硬币)进行称重,那么你只有两个案例,假设单个假币只能在这三个堆栈中的一个中:

1。)双方都有相同的重量:假币不能在两个堆栈中称重,所以必须在第3位:你将问题空间减少到1/3

2。)一侧比另一侧重得多:因为只有一个假硬币,它必须在重量较轻的一侧:再次将问题空间减少到1/3

冲洗并重复。

答案 1 :(得分:3)

“减3”算法的工作原理是,只需进行1次比较,就可以减少必须比较1/3的弹珠集。

将弹珠分为3组,其中2组为1组和2组。

  1. 如果组1的重量= =组2的重量,则组3具有假大理石
  2. 如果组1的重量<1。第2组的重量,然后第1组有假大理石
  3. 如果组1的重量>第2组的重量然后第2组有假大理石
  4. 当然,这假设原始的一组弹珠可以分成3组。如果不是这种情况,则均匀分成3组(每组具有相同数量的弹珠)并保留剩余的(0,1或2)弹珠并将它们添加回你必须考虑的弹珠组在比较步骤之后。