8 瓶水 2 瓶有毒 6 个耗子 要求单次检验出结果

2021-04-20 18:58:15 +08:00
 eroko
这题应该怎么算?
11517 次点击
所在节点    问与答
146 条回复
Elethom
2021-04-21 06:43:37 +08:00
@snw
两瓶毒的情况,应该是对半分的。ABCD 、EFGH 、ABEF 、CDGH 、ACEG 、BDFH 这样子,可以理解为一个西瓜切三刀(就是我上面那个比喻),扩展到无限维度就可以解决更多瓶子的问题。上面我说五瓶确实是草率了,我道歉。

写了一段代码验证:
( Swift 的编译检查不怎么待见 bitwise calculation 的样子,所以写成 Int 了,见谅)
https://gist.github.com/Elethom/e31af1a9f576d150aa691c5468bed379
tianxia
2021-04-21 06:44:30 +08:00
不需要什么算法,直接给 6 只耗子分别喂 6 瓶水,就保证单次检验出结果,不信可以尝试
Mutoo
2021-04-21 06:54:43 +08:00
@tianxia 是呀
6 只都没事,剩下两瓶有毒
5 只没事,1 只喝的是毒,剩下一瓶有毒
4 只没事,2 只喝的是毒。
根本不需要什么算法。
tianxia
2021-04-21 06:54:59 +08:00
@Elethom 会导致毒药剂量不够,毒不死
Elethom
2021-04-21 06:55:51 +08:00
@Mutoo
剩下的是两瓶。
tianxia
2021-04-21 07:00:02 +08:00
@Elethom 实际给你操作,保证一次出结果
Mutoo
2021-04-21 07:00:12 +08:00
@Elethom 对哦,走神了
chrisouta
2021-04-21 07:05:06 +08:00
https://en.wikipedia.org/wiki/Group_testing
果然深似海,学到了很多,感谢楼主的问题。
现有的理论还没有保证最优的算法,问题确实需要对矩阵进行搜索,wiki 里提到了几种搜索方法可以参考。
甚至还有老鼠有概率死有概率不死的扩展,更复杂了🐶
Elethom
2021-04-21 07:17:46 +08:00
#41 是我傻逼了。下界是 5 没错但是重新算了下上界还要再高一点。
Elethom
2021-04-21 07:19:01 +08:00
@Elethom 大概在 log(2, n) * 2 * log(2, n/2)
chrisouta
2021-04-21 07:33:40 +08:00
2 瓶毒,上界应该是下界加 1,六只老鼠,所以问题一定有解,看来 6 只老鼠不是随随便便选的。
In scenarios where there are two or more defectives, the generalised binary-splitting algorithm still produces near-optimal results, requiring at most d-1 tests above the information lower bound where d is the number of defectives.
Elethom
2021-04-21 07:34:23 +08:00
@chrisouta
的确比看起来更复杂。 😭
elfive
2021-04-21 07:38:17 +08:00
8 瓶水放到 9 宫格里,每行每列取样混在一起,正好 3 行 3 列,6 只耗子一次性喝混出来的一瓶,就可以了。

这就是二维的奇偶校验。
chrisouta
2021-04-21 07:55:48 +08:00
#53 两瓶毒在对角上无法区分在主对角还是次对角吧。这里的加法运算毕竟不是模二加,是直接或运算,跟奇偶校验应该不同。
popil1987
2021-04-21 08:40:48 +08:00
按照一楼的解法:8 瓶里 2 瓶有毒共 28 种组合(状态),那么 5 只老鼠可以表示 32 种状态就可以了吧,是不是能让一只老鼠去做电击实验?
SlipStupig
2021-04-21 10:48:36 +08:00
@suisetai 万一老鼠都变异了毒不死怎么办呢。。
palfortime
2021-04-21 11:18:28 +08:00
@noe132 #1 这种二进制编码的方案只能找 64 瓶里只有 1 瓶有毒的情况吧,混合出来的 64 瓶远远不只 1 瓶有毒。多瓶叠加在一起,无法用 6 只老鼠来找出吧。
没有想到单次校验的。
我的想法是 8 瓶分成 2 批,再用这种位编码的方式来找出每组里有毒的。具体会产生两种情况:
2 批都有死或者都没有死,这样用位编码方式来算,用 4 只来试就可以。
另外一种情况就是只有 1 批有死。这种情况有分为两种子情况:1. 没死的那批,00 是有毒的。2. 2 瓶有毒都在 1 批。
针对子情况 1,找没有死的去喝 00,挂了就出结果。没有挂的话,那么现在还活着的还有 4 只,4 只对应有毒的那批的 4 瓶。那么结果也可以出来。
dicc
2021-04-21 11:22:32 +08:00
@Elethom #45 剩下两瓶,一有一无毒,你再喝一瓶
nieyujiang
2021-04-21 11:27:52 +08:00
六个老鼠一只一瓶,面试官再喝一瓶.最后一瓶自己的.
man9820
2021-04-21 11:34:24 +08:00
@suisetai 他要一次性,大概意思是同时进行,要不方式太多了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/771969

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX