Algorithm 给定n枚硬币,其中一些较重,找到重硬币的数量吗?
给定n枚硬币,其中一些较重,使用O(对数^2 n)称重法计算重硬币数量的算法。请注意,所有重硬币的重量相同,所有轻硬币的重量也相同Algorithm 给定n枚硬币,其中一些较重,找到重硬币的数量吗?,algorithm,Algorithm,给定n枚硬币,其中一些较重,使用O(对数^2 n)称重法计算重硬币数量的算法。请注意,所有重硬币的重量相同,所有轻硬币的重量也相同 您可以使用天平比较两个不相交的硬币子集的重量。请注意,天平只指示哪个子集更重,或者它们是否具有相等的权重,而不是绝对权重。我不会给出完整的答案,但我会帮助您将其分解 找到一个O(log(n))算法来找到一枚重硬币 找到一个O(log(n))算法,将一个集合拆分为两个集合,其中重计数和轻计数的数目相等,加上最多两个剩余量(当每个集合的数量不相等时) 结合算法#1和#2
您可以使用天平比较两个不相交的硬币子集的重量。请注意,天平只指示哪个子集更重,或者它们是否具有相等的权重,而不是绝对权重。我不会给出完整的答案,但我会帮助您将其分解
O(log(n))
算法来找到一枚重硬币O(log(n))
算法,将一个集合拆分为两个集合,其中重计数和轻计数的数目相等,加上最多两个剩余量(当每个集合的数量不相等时)- 算法1独立于算法2
二进制搜索提示O(log(n))
- 你怎么会得到两个
算法O(log^2(n))
{c | c重}
。但是请注意,可能的子集数为2^n
。每次比较都可以将你的候选人名单“缩小”一半。因此,比较需要的总数量是Omega(log(2^n))=Omega(n)
@amit我们不需要找到重硬币的子集,只需要找到它的基数。如果您接受上面的#2,则重硬币的数量是其中一个等重边重硬币数量的两倍(加上分割后的一个或两个剩余部分中的任何重硬币)。另一面可能会被丢弃,因为我们并没有试图实际分离重硬币,其中重硬币的数量与另一面相同。因此,每次操作都会将桩体一分为二。lg n操作有lg n迭代(加上lg n以找到一个初始权重以与剩余进行比较)。把这堆东西一分为二。如果两半的重量相同,则完成,因此假设不是。定义从左到右和从右到左旋转硬币的顺序。如果你一次只做一对,天平就会达到平衡或朝另一个方向倾斜的点。根据您的顺序,执行二进制搜索,以查找何时发生这种情况。