经典问题与12硬币(或弹子)其中之一是假的。假币比假币轻。假硬币问题
有比较硬币(或弹子)的比例。
一个可以做比较一个一个比较所有12个硬币。
更高效地使用Decrease By Factor算法可以做到这一点。其中硬币堆栈分为2和比较2个堆栈。
减少系数2的大O为log2n。
通过因子3(log3n)算法可以更有效地减少,但我还没有找到它。
如果有人解释它,为什么它更高效让我知道。
经典问题与12硬币(或弹子)其中之一是假的。假币比假币轻。假硬币问题
有比较硬币(或弹子)的比例。
一个可以做比较一个一个比较所有12个硬币。
更高效地使用Decrease By Factor算法可以做到这一点。其中硬币堆栈分为2和比较2个堆栈。
减少系数2的大O为log2n。
通过因子3(log3n)算法可以更有效地减少,但我还没有找到它。
如果有人解释它,为什么它更高效让我知道。
这里的主要思想是在设置测试时使用更多的问题知识:如果你分成3个而不是两个堆栈,并用两个堆栈(每个包含相同数量的硬币)进行称量,假设单个假币只能在以下三个堆叠中的一个中,您可以只有两种情况:
1.)双方有相同重量:假币不能在两个堆叠中称重,所以必须在第三步:你将问题空间减少到1/3
2.)一方重量比另一方重:因为只有一枚假币,它必须位于重量的一侧s:再次将问题空间减少到1/3
冲洗并重复。
这是我偶然发现的一个我最喜欢的问题,3个权重是可行的,但我从来没有想过'通用算法',所以解决它。 顺便说一句,分为三部分是开始的方式,取决于结果你需要选择不同的事后。当然,最糟糕的是当你有不同的时候,比如说1234'重'和'5678'的灯。需要记住的是1234不能“轻”,5678不能重。当然9,10,11,12也不是。 哦,我认为这是假硬币不同(即更轻或更重)的问题。抱歉。 – Valmond
“减少3”算法的工作原理是,只需进行1次比较,就可以减少三分之一的弹珠比例。
拆分弹珠分为3组,并且将它们的权重2,说组1和2
当然,这假定吨他原来的一套弹珠可以平均分成3组。如果不是这种情况,那么均匀分成3组(每组有相同数量的弹珠),并将剩余的(0,1或2)弹珠放在一边,并将它们添加回必须考虑的弹珠组在比较步骤之后。
O(log 2 n)≡O(log 3 n)≡O(log n)。如果你说“大O”,对数的基数并不重要,因为它只是一个[常数因子](http://en.wikipedia.org/wiki/Big_O_notation#Multiplication_by_a_constant)。 – kennytm