算法设计——用最少的测试人员识别酒窖中的单瓶

标签 algorithm

这是为了在算法课上加分。问题状态

A king has a wine cellar of N bottles, and a single bottle has been poisoned.
The poison takes approximately a month to work. The king wants the exact bottle identified using the fewest testers possible within a months time.

我的解决方案是

  • N 个瓶子分成 M 个批处理并使用“M 个测试器”

    • 第一个测试者品尝第一批和最后一批

    • 第二位测试员品尝了第一批和第二批。

    • 第三位测试员品尝了第二批和第三批。

    • 继续进行 M 批处理,测试人员重叠批处理。

  • 当品尝了受污染 Wine 的两名测试员生病时,该批处理的酒就被鉴定出来了。 M-2 测试人员从受污染的批处理中给每个人留下一瓶,第三个生病的测试人员识别出受污染的瓶子。

但是,该算法需要双倍的工作时间:一个月用于识别受污染的批处理,第二个月用于识别受污染的瓶子。有没有更高效的算法?

最佳答案

我们可以用 log2(N) 来做具有非常简洁的算法的测试人员。

让我用一个简单的例子来证明它。假设 N = 1000 .

如果我们给瓶子贴上标签0通过999 , 然后每个瓶子都可以用一个唯一的二进制数表示,范围从 0000000000 (0 十进制)到 111100111 (999 十进制)。

声明:我们只需要10个测试人员就可以找到毒瓶。注:log2(N) = log2(1000) = 10 .

算法:对于M th 瓶子,我们首先得到 M 的 10 位二进制表示.如果i二进制数的第 bit 是 1 ,我们让 i th 测试员从瓶子里喝了酒。注:0 < M <1000, 0 < i <10 .

考虑一个例子,我们有 1st , 4th , 9th测试员死了,一个月后其他测试员还活着。我们得出结论 289th瓶子是自0100100001以来中毒的那个是十进制数的二进制表示 289 .

为什么是10测试人员足以识别中毒者 1000瓶子?

因为 10每个测试人员最后是死是活,我们总共可以有 1024组合,每个组合都可用于从多达 1024 中唯一识别一瓶中毒的瓶子瓶子。

关于算法设计——用最少的测试人员识别酒窖中的单瓶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14406604/

相关文章:

algorithm - 归并排序究竟进行了多少次比较?

c# - 计算大量粒子之间经历的类似重力的最快方法?

java - 找出循环依赖的路径

java - 使用任一策略将记录发送到消息队列

c# - 如何概括我的算法以检测一个字符串是否是另一个字符串的旋转

algorithm - 是否可以将元素插入复杂度低于 O(n) 最坏情况的 BST?

c - 该算法(Big-O)的时间复杂度是多少?

algorithm - 在固定容量中找到所有可能的段平铺

algorithm - 为什么这个简单的洗牌算法会产生有偏差的结果?

algorithm - 最少乘坐次数