algorithm - 找到两个不同的硬币

标签 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?

任何帮助。

最佳答案

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

  1. 如果两堆硬币的重量相同,那么您就知道每堆硬币一定包含其中一枚较重的硬币,并且两枚较重的硬币重量相同。在每堆上使用“一个较重的硬币解决方案”。
  2. 如果两堆重量不一样,将较轻的那堆分成两堆,每堆有 2k-2 个硬币。这里的想法是,我们还不知道是较重的那堆有两个重硬币,还是这两堆各有一个(较重的那堆有最重的硬币),我们将使用第二次称重来找出是哪一个。
    • 如果这两堆硬币的重量不同,那么第一次称重的两堆硬币都必须各有一枚重硬币(并且两堆硬币的重量不同)。在每堆上使用“一个较重的硬币解决方案”。
    • 如果这两堆确实重量相同,那么两枚较重的硬币必须在较重的 2k-1 硬币堆中.递归那堆。 (稍后我们会弄清楚这两枚重硬币的重量是否不同)。

现在,对于称重次数的证明。

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

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

关于algorithm - 找到两个不同的硬币,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19439567/

相关文章:

algorithm - 重叠间隔子集的最大数量

c - 数组中的大多数元素分而治之 O(N.log(N))

c# - 为我的计算寻找数学函数(算术级数)

c++ - C++ 中的 Bron Kerbosch 算法

c++ - 分而治之是否总能获得更好的表现?

algorithm - closest to zero [absolute value] 实值序列的连续子序列之和

sorting - 快速排序是一种分而治之的方法吗?

转换数组大小

algorithm - Clojure DAG(贝叶斯网络)

javascript - 多维背包的启发式