找到两个不同的硬币

时间:2013-10-18 00:26:58

标签: algorithm divide-and-conquer

问题在于:

你有n个硬币,其中n = 2 ^ k为整数k,使得n - 2个硬币是相同的 重量和两个硬币比其他硬币重。两个较重的硬币可能具有相同的重量, 或者它们的重量可能不同。你有一个平衡秤:你可以放任意数量的硬币 在秤的每一侧一次,它会告诉你双方是否重量相同,或者如果它们的重量不同,哪一侧更轻。概述了使用O(log n)权重找到两个较重硬币的算法。

如果只有一枚硬币与其他硬币不同,我知道答案。我也发现类似的问题,不同的硬币已知更重。

Given n coins, some of which are heavier, find the number of heavy coins?

任何帮助。

1 个答案:

答案 0 :(得分:2)

假设您将硬币分成两堆2个 k-1 硬币。

  1. 如果两个桩的重量相同,那么你知道每个桩必须包含一个较重的硬币,而两个较重的硬币的重量相同。使用你的一个较重的硬币解决方案"在每一堆上。
  2. 如果两个桩的重量不相同,则将较轻的桩分成两堆,其中有2个 k-2 硬币。这里的想法是,我们还不知道较重的桩是否有重型硬币或者每个桩是否有一个(并且较重的桩具有最重的硬币),我们将使用第二个称重找出哪个。
    • 如果这两个桩的重量不相同,那么第一次称重的两堆硬币每个必须有一个重硬币(两个具有不同的重量)。使用你的一个较重的硬币解决方案"在每一堆上。
    • 如果那两堆的重量相同,那么两枚重币都必须在较重堆中的2个 k-1 币中。递归那堆。 (并且我们将弄清楚这两个重币是否会在以后变重)。

  3. 现在,为了证明称重次数。

    假设我们从不使用"一个重型硬币解决方案",这种设置将在最坏的情况下进行两次称重,将搜索空间减少一半。因此,这里的称量数是2 log n

    请注意,我们使用的是一个更重的硬币解决方案"最多两次。因此,松散的上限是2 log n来自上述两个步骤,加上一个较重的硬币解决方案"的称重次数的2倍,这得到我们2 log n + 2 * O(log n),这是仍然是O(log n)