我们给出了N个对象,其中只有一个对象具有不同的权重(可以更少或更多)。此外,我们给出了以下3种类型的M比较 -
其中Set A和Set B(两者具有相同数量的对象)是来自初始N个对象的对象列表。
鉴于M这样的比较,我需要找到具有不同重量的物体。否则告诉M给定的给定列表不足以检测具有不同权重的那个。
有人可以建议一种解决这个问题的算法吗?
答案 0 :(得分:0)
有2N的可能性 - 物体1是光,物体1是重物,物体2是光,物体2是重物,......物体N是光,物体N是重物。只需检查给定的条件是否与每种可能性兼容。如果只有一种可能性与称重一致(或者对应于物体轻或重的两种可能性),则条件就足够了。如果没有一致的可能性,则条件不一致。否则,条件不足。
答案 1 :(得分:0)
如果您知道不同重量的物体是重物还是更轻,那么您可以在ceil(log3(N))比较中找到它。
基本方法是将对象分成三个偶数堆,并将两个堆与相同数量的对象进行比较。如果它们相等则物体在第3堆中。如果没有,那么你知道两个桩中的哪一个与物体相比,因为你知道它是重物还是打火机。因此,您可以扔掉不包含不同重量物体的两个桩。由于这会在每次比较时将搜索对象的数量减少三倍,因此如果N是3的幂,您将能够进行log3(N)比较,如果不是则那么您将需要制作尽可能多的对象比较为N的下一个三次幂。
如果您不知道不同重量的物体是否比其他物体重或轻,则需要大约log3 / 2(N),因为在最坏的情况下,您只能扔出三个桩中的一个,从而减少了三分之二的对象数量。
答案 2 :(得分:0)
我认为你可以使用比提议的更简单的算法,因为你知道一个对象只有不同的权重。
管理每个对象的两个标志,以指示它们是否可能更重或更轻(因此最初它们未设置)。迭代所有给定的比较并设置标志如下:
现在你可以通过对象的单次迭代找到解决方案,即它们的标志,但是这有点棘手,因为特殊情况下你只是有等式并且在任何比较中都没有出现任何对象然后它必须是解决方案:
初始化solution = null
,noFlagSolution = null
,noFlagCount = 0
。
迭代对象:
noFlagSolution = current
,noFlagCount++
solution != null
:返回null
(我们有多个候选人)。solution = current
如果solution != null
:返回solution
(在这种情况下,我们也可以判断对象是重物还是更轻)。
如果noFlagCount == 1
:返回noFlagSolution
(上面提到的特殊情况,我们不知道唯一的候选人是更重还是更轻)。
否则没有独特的解决方案。