【发布时间】:2014-09-03 06:02:19
【问题描述】:
假设您在一个带有N 开关的房间里,而隔壁房间里有一个灯泡。只有当某些特定的开关全部打开时,灯泡才会发光。
设置
-
switches= 所有开关的集合。|switches| = N。 -
required= 需要打开才能使灯泡发光的开关。
不需要的开关无关紧要。
只有进入下一个房间才能检查灯泡是否发光。你可以打开或关闭一些开关,去隔壁房间检查灯泡,然后重复这个过程。让我们称之为一次尝试。
假设有N 开关,在最坏的情况下,找出required 开关集所需的最少尝试次数是多少(使用优化策略)?
例如,
switches = { 1, 2, 3 }required = { 1, 2 }
让我们尝试一种简单的方法:
- 打开
{ 1, 2 },灯会发光。 (确保不需要开关 3) - 打开
{ 1, 3 },灯不亮。 (确保需要开关 2) - 打开
{ 2, 3 },灯不亮。 (确保需要开关 1)
因此通过 3 次尝试,我们可以确保 required = { 1, 2 }。
这个问题的优化算法是什么?
让worst(N) 成为考虑N 在最坏情况下切换的最小尝试。你能找到worst(N)
更新:如果你认为worst(N) = N,你能提供一个正式的证明吗?
【问题讨论】:
-
这就像公牛和奶牛的简化版。
-
在最坏的情况下,它们都是必需的,并且需要 N 次尝试来验证它。对?因为每次尝试都会告诉您是否需要一组开关中的至少一个元素。所以你不能一次将你知道的数字增加超过 1 个。
-
能否请您澄清一下:非必需的开关是忽略,还是会关闭灯泡?例如。如果我们打开每个开关,包括不需要的开关,灯泡会亮吗?如果是这样,这可以为二进制搜索方法奠定基础。
-
@PelitMamani。不需要的开关被忽略。抱歉描述不清楚
-
@miaout17 只有在所需开关的数量已知并且它们是
1 or N - 1时才会有 log(N) 解决方案。