Algorithm 给定n枚硬币,其中一些较重,找到重硬币的数量吗?

Algorithm 给定n枚硬币,其中一些较重,找到重硬币的数量吗?,algorithm,Algorithm,给定n枚硬币,其中一些较重,使用O(对数^2 n)称重法计算重硬币数量的算法。请注意,所有重硬币的重量相同,所有轻硬币的重量也相同 您可以使用天平比较两个不相交的硬币子集的重量。请注意,天平只指示哪个子集更重,或者它们是否具有相等的权重,而不是绝对权重。我不会给出完整的答案,但我会帮助您将其分解 找到一个O(log(n))算法来找到一枚重硬币 找到一个O(log(n))算法,将一个集合拆分为两个集合,其中重计数和轻计数的数目相等,加上最多两个剩余量(当每个集合的数量不相等时) 结合算法#1和#2

给定n枚硬币,其中一些较重,使用O(对数^2 n)称重法计算重硬币数量的算法。请注意,所有重硬币的重量相同,所有轻硬币的重量也相同


您可以使用天平比较两个不相交的硬币子集的重量。请注意,天平只指示哪个子集更重,或者它们是否具有相等的权重,而不是绝对权重。

我不会给出完整的答案,但我会帮助您将其分解

  • 找到一个
    O(log(n))
    算法来找到一枚重硬币
  • 找到一个
    O(log(n))
    算法,将一个集合拆分为两个集合,其中重计数和轻计数的数目相等,加上最多两个剩余量(当每个集合的数量不相等时)
  • 结合算法#1和#2 提示:

    • 算法1独立于算法2
    • O(log(n))
      二进制搜索提示
    • 你怎么会得到两个
      O(log^2(n))
      算法

    也许你可以更具体地说,在最后一句话中,你说有相同的重量?这意味着有两种重量,“重”和“轻”。你知道每种轻硬币的重量与每种重硬币的重量之比吗?“称重”是指一套硬币的重量,还是指一套硬币的重量大于另一套硬币的重量,还是指一套硬币的重量大于另一套硬币的重量?在不知道“称重”提供什么信息的情况下,没有足够的信息来回答这个问题。@MarkBannister给你一个天平,你可以用它来比较两个不相交的硬币子集的重量。请注意,平衡只表示哪个子集更重,或者它们是否具有相等的权重,而不是绝对权重。这看起来像是家庭作业问题或面试问题。如果你分享你的思考过程并缩小到具体的问题,你可能会得到更好的回答,或者在这一点上重新打开。为了找到O(对数n)中的单个重硬币,我们可以将所有硬币分成两半,然后选择较重的一半,然后再将其分成两半,然后选择较重的部分,依此类推。这是正确的吗?这就像是二进制搜索。这是要点,但你也需要能够说出两半重量相等的情况,以及如何处理硬币数量不可等分的情况。你有什么具体的想法吗?或者你给出了一个只是猜测的算法?我很确定,用一个类似于排序是欧米茄(nlogn)问题的证明,它做得比O(n)更好。在这里,您需要找到一个子集硬币
    {c | c重}
    。但是请注意,可能的子集数为
    2^n
    。每次比较都可以将你的候选人名单“缩小”一半。因此,比较需要的总数量是
    Omega(log(2^n))=Omega(n)
    @amit我们不需要找到重硬币的子集,只需要找到它的基数。如果您接受上面的#2,则重硬币的数量是其中一个等重边重硬币数量的两倍(加上分割后的一个或两个剩余部分中的任何重硬币)。另一面可能会被丢弃,因为我们并没有试图实际分离重硬币,其中重硬币的数量与另一面相同。因此,每次操作都会将桩体一分为二。lg n操作有lg n迭代(加上lg n以找到一个初始权重以与剩余进行比较)。把这堆东西一分为二。如果两半的重量相同,则完成,因此假设不是。定义从左到右和从右到左旋转硬币的顺序。如果你一次只做一对,天平就会达到平衡或朝另一个方向倾斜的点。根据您的顺序,执行二进制搜索,以查找何时发生这种情况。