- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设您在一个有 N
个开关的房间里,隔壁房间里有一个灯泡。只有当一些指定的开关全部打开时,灯泡才会发光。
设置
switches
= 所有开关的集合。 |开关| =N
。 required
= 需要打开才能使灯泡发光的开关。 不需要的开关无关紧要。
只有进入下一个房间才能检查灯泡是否发光。你可以打开或关闭一些开关,去下一个房间检查灯泡,然后重复这个过程。让我们称之为一次尝试。
假设有 N
个开关,在最坏的情况下,找出一组 required
开关(使用优化策略)所需的最少尝试次数是多少?
例如,
开关 = { 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 次尝试
如果有 N 个开关,则可以有 2^N 个可能的“必需”集合,因为每个开关都可以在“必需”集合内或之外。
为了区分 2^N 个可能的集合,您可以认为我们需要通过摆弄开关来获得至少 N 位的信息。如果不是,则有可能有不止 1 组都可以符合我们目前已知的信息。
假设有 8 种可能的配置 (N = 3),我们可以选择配置的子集并查询“所需”配置是否在所选子集中。执行此操作的最佳方法类似于二进制搜索,实现 log(2^N) 的复杂性,这只是 N 次尝试。如果我们使用少于 3 次尝试,我们将留下至少 2 个配置,我们无法确定哪个是正确的,因为每次尝试都会消除一半可能的配置。
回到最初的问题,假设我们到目前为止使用了 K 次尝试,其中 K < N。由于每次尝试都会提供 1 位信息(是,它亮起/不,它不亮),每次尝试都可以消除一半可能的配置,在 K 次尝试后我们将剩下 2^(N-K) 种可能的配置。
为了仅获得“必需”集的 1 种不同的可能配置,我们需要 K = N,这将为我们提供 2^(N-N) = 2^0 = 1 种可能的配置。
这给了我们这个问题的下限,因为每次尝试都会提供 1 位信息(是的,它亮起/不,它不亮)。因此,我们至少需要 N 次尝试。
使用不超过 N 次尝试的可能解决方案
由于“非必需开关无关紧要”,如果我正确解释它,这意味着如果打开“必需”组之外的开关,除了“必需”组中的那些之外,灯将还在。由于我们有 N 次尝试使用(并且仍然使其成为最优),我们可以负担得起使用以下解决方案:对于每个开关(按顺序),打开除此开关之外的所有其他开关。检查灯是否关闭。如果关闭,唯一保持关闭状态的开关将在“必需”集中。
此解决方案将使用恰好 N 次尝试(即使在最坏的情况下)并且它是最佳解决方案之一(如前所述)。
关于algorithm - 找到打开灯泡所需开关的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25637265/
有没有办法禁用IntelliJ中的代码分析(灯泡)?在查看一些第三方代码时,我真的不在乎代码改进建议。我已经在“项目设置”->“检查”中取消选中了所有单个功能。 我正在使用IntelliJ 10.5编
我正在使用 TitanGraphDB + Cassandra。我按如下方式启动 Titan cd titan-cassandra-0.3.1 bin/titan.sh config/titan-ser
我正在使用灯泡来创建顶点。我编写了下面给出的 3 个函数来执行相同的操作。只是为了帮助您理解我在每个函数中的调试行输出下方列出的顶点属性。 DEBUG LINE: self.logger
我最近开始研究图及其不同的遍历算法,似乎无法得出这个问题的答案。我真的需要你的帮助,我什至不知道从哪里开始。附言昨天是我的生日,我不想因为这个问题而哭。 纽约的一家公司生产汽车用蓝色卤素灯泡。不幸的是
有没有办法让灯泡像 netbeans 一样留在边缘?或者至少有一种方法可以单击突出显示的代码并获得修复菜单而不是弹出信息? 我不喜欢每次都按 alt enter 来修复某些问题,所以我希望能够在不按
这个问题与在哪里可以为新的Visual Studio 2015灯泡或快速操作功能自定义规则集有关。 具体来说,我想禁用以下图像,以便将“ String.IsNullOrWhiteSpace”简化为“
我希望通过智能手机应用程序使用 WiFi 连接来打开或关闭 LED 灯泡。我尝试了各种网站,但找不到合适的答案。我只是想知道如何将 WiFi 接收器与灯泡中的微 Controller ,然后通过 An
我用纯 CSS 制作了一个灯泡,我希望灯泡在点击时改变颜色。但是我的灯泡形状由两个形状组成,所以我不能将鼠标悬停在两者之上。有没有办法在不使用 JavaScript 的情况下解决这个问题,只坚持使用
我想知道Visual Studio 2015中的键盘快捷键是什么,它使我可以前进到正在查看的文件中的下一个快速操作。 我正在寻找的行为将类似于ReSharper的“下一个代码问题”(F12)快捷方式。
我正在使用 TitanGraphDB + Cassandra。我按如下方式启动泰坦 cd titan-cassandra-0.3.1 bin/titan.sh config/titan-server-
我正在使用 TitanGraphDB + Cassandra。我按如下方式启动 Titan cd titan-cassandra-0.3.1 bin/titan.sh config/titan-ser
我已完成此答案中列出的所有内容:https://stackoverflow.com/a/31614259/602114 , 但每当我重命名私有(private)字段时,灯泡仍然会弹出,在本例中是从 d
我艰难地发现,如果你在 python 中设计导入函数,为每个节点使用单个事务,那么速度会非常慢。 我有数百万个节点,必须以尽可能最快的方式处理它们。目前,我有一个 gremlin 脚本,它返回生成器中
Phillips 有这些说明 (https://developers.meethue.com/develop/get-started-2/) 用于连接到/使用他们的 Hue 灯。显然,他们每个人都有一
我是新手,正在尝试学习 Python、Bulbs、Neo4j。当我只是尝试创建一个 Graph 对象时,我不知道如何调试一开始就出现的这个问题。这是回溯: File "test.py", line
目前,从 Font Awesome(我这里只处理 4.x 版)“填充”灯泡图标的唯一方法是将填充颜色应用为背景。但是你最终会在图标周围看到一个丑陋的方框。 不是最理想的! (也很丑!) 我很好奇是否有
我正在构建一个使用 BulbFlow 的应用程序. BulbFlow ORM 类似于 Django ORM。作为实际的数据库后端,我使用 OrientDB 1.3.0 , 与 Rexster 2.2.
我是一名优秀的程序员,十分优秀!