天平找假币问题(二分查找)

108 阅读2分钟

有数量为n的硬币,和一个天平,已知其中有一个假币,且假币比真币轻,请找出这枚假币。

把硬币两半分,假币就在轻的一堆,然后不断的分成均匀的两堆,最后总能找出假币。

解题思路

采用三分法称重。

  1. 将 nn 个硬币分为三组:A、B、C,保证 A 和 B 的硬币数相同,且 A 与 C 的硬币数最多相差一个。

  2. 先将 A 和 B 放在天平两端称重,根据结果判断假币所在组:

    • 若 A < B,说明假币在 A 中(较轻);
    • 若 A > B,说明假币在 B 中;
    • 若 A = B,说明假币在 C 中。
  3. 每次称重后,要么找到假币(当某组只剩一枚硬币),要么问题规模缩小为约 n/3n/3。

  4. 因此,最多称重次数为 C(n)=⌈log⁡3n⌉C(n)=⌈log3​n⌉。

示例

以 n=101n=101 为例的称重过程

image.png

  1. 第一次称重
    将 101 枚硬币分为 A34、B34、C33(A、B 各 34 枚,C 为 33 枚)。
    称 A34 与 B34:

    • 若 A < B,假币在 A34 中;
    • 若 A > B,假币在 B34 中;
    • 若 A = B,假币在 C33 中。
      由此确定假币在哪一份中。
  2. 第二次称重
    假设假币在 A34 中,将 A34 再分为三份:AA11、BA11、CA12(AA 与 BA 各 11 枚,CA 为 12 枚)。
    称 AA11 与 BA11:

    • 若 AA < BA,假币在 AA11 中;
    • 若 AA > BA,假币在 BA11 中;
    • 若 AA = BA,假币在 CA12 中。
      确定假币在哪一份中。
  3. 第三次称重
    假设假币在 AA11 中,将 AA11 再分为三份:AAA4、BAA4、CAA3(AAA 与 BAA 各 4 枚,CAA 为 3 枚)。
    称 AAA4 与 BAA4,确定假币在哪一份中。

  4. 第四次称重
    假设假币在 AAA4 中,将 AAA4 再分为三份:AAAA1、BAAA1、CAAA2(AAAA 与 BAAA 各 1 枚,CAAA 为 2 枚)。
    称 AAAA1 与 BAAA1:

    • 若不等,轻者为假币;
    • 若相等,假币在 CAAA2 中。
  5. 第五次称重
    若假币在 CAAA2(2 枚硬币)中,只需称其中一枚与一枚已知真币,即可确定哪一枚是假币。