- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当我试图将二分搜索应用于现实世界时,它让我失望了。场景如下。
I need to test the range of a device that communicates over radio. Communication needs to occur quickly, but slow transmission is tolerable, up to a point (say, about 3 minutes). I need to test whether transmissions will be successful every 200 feet until failure, up to 1600 feet. Every 200 feet a test will be run which requires 3 minutes to execute.
我天真地假设二分查找是找到故障点的最有效方法,但考虑到 200 英尺/分钟的行进速度和 3 分钟的测试时间。如果传输失败发生在 500 英尺处,二分查找不是查找故障点的最有效方法,如下所示。
简单地向前走并测试每个点会更快地找到解决方案,只需 12 分钟,而二进制搜索和测试将需要 16 分钟。
我的问题:当旅行时间很重要时,您如何计算最有效的解决方案路径?这叫什么(例如,二进制旅行搜索等)?
最佳答案
二分查找确实基于O(1)
访问时间;例如,二进制搜索链表几乎没有意义 [但请参阅注释 1],这实际上就是您正在做的事情,因为您似乎假设只有离散间隔才值得测试。如果您正在寻找更准确的答案,您会发现二分搜索允许任意精度,但代价是每一位精度需要进行一次额外测试。
假设您甚至不知道最大值是多少。然后你不能先在中间测试,因为你不知道中间在哪里。相反,您可以对极限进行指数搜索(这是一种由内而外的二进制搜索);您首先在 x
处进行测试, 然后 2x
, 然后 4x
直到你到达一个大于最大值的点(信号没有达到那么远)。 (x
是您觉得有趣的最小答案;换句话说,如果第一次测试 x
显示信号未到达,您将停止。)在此阶段结束时,您将在2<sup>i</sup>x
, 对于一些整数 i
,你就会知道答案在2<sup>i-1</sup>x
之间。和 2<sup>i</sup>x
.
现在您实际上可以进行二分查找了,从 2<sup>i-2</sup>x
开始.从那里,你可以向前或向后走,但你一定会旅行2<sup>i-3</sup>x
,下一次迭代你将旅行 2<sup>i-4</sup>x
, 等等。
总而言之,在第一阶段(搜索最大值),您走到了2<sup>i</sup>x
。 ,并做了 i
测试。在第二阶段,二进制细化,你总共走 (2<sup>i-1</sup>-1)x
并做 i-1
测试。你会在某个时候结束 d
在 2<sup>i-1</sup>
之间和 2<sup>i</sup>
,所以在最坏的情况下你会走路3d
最后一点(充其量,您将步行 3d/2
)。您将完成的测试数量将为 2*ceil(log<sub>2</sub>(d/x)) - 1
,这是在 2*log<sub>2</sub>(d/x)
的一次测试中.
那么什么情况下应该做二分查找算法呢?基本上,这取决于旅行时间与测试时间的比率,以及所需的答案精度。简单的顺序算法找到位置 d
在 d/x
之后大小移动 x
和 d/x
测试;上面的二进制搜索算法找到位置 d
最多旅行后3d
但只做 2 log(d/x)
测试。粗略地说,如果一次考试的花费是旅行费用的两倍多d/x
, 并且期望的距离比精度足够大,你应该更喜欢二分查找。
在您的示例中,您似乎想要精度为 200 英尺的结果;行车时间为1分钟,测试时间为3分钟,是行车时间的两倍多。所以你应该更喜欢二进制搜索,除非你期望答案会在精度的小数倍数中找到(情况就是这样)。请注意,尽管二进制算法使用四次测试和 1000 英尺的行程(与顺序算法的三次测试和 600 英尺相比),将精度提高到 50 英尺只会增加四次测试和 150 英尺的行程到二进制算法,而顺序算法将需要 20 次测试。
注意 1:实际上,如果测试成本很高,则使用上述算法对链表进行二分查找可能是有意义的。假设测试成本与列表中的索引不成正比,则搜索的复杂度将为 O(N)
对于线性搜索和二分搜索,但二分搜索将执行 O(log N)
测试和 O(N)
步骤,而顺序搜索将执行 O(N)
测试和 O(N)
脚步。对于足够大的 N,这无关紧要,但对于真实世界大小的 N,这可能很重要。
关于algorithm - 二分查找在遍历成本方面效率不高。什么是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13676328/
我在 GlassFish (J2EE_1.4) 上的 NetBeans 中开发企业项目。我的项目中有一些实体 bean、一些 session bean 和消息驱动 bean。我以如下方式使用 serv
什么在速度方面更好...... 我正在尝试确定用户是否已将某个 URL 添加到他们的快捷方式列表中。如果他们添加了 URL,页面上就会有一个链接,用于从快捷方式中删除该页面,否则他们可以将其添加到快捷
我的问题如下: 我打开一个Excel-File,但我不知道我的客户在模板文件中使用了哪些可能的标头变量。它们可以是:#DATE,#TIME,#NAME等。因此,我需要查找这些变量,以及是否已使用过:替
我有一堆以“-e”结尾的文件要删除。 $ find . -name "*-e" exec rm {} \; find: exec: unknown primary or operator 正则表达式是
我有一个简单的问题:是否可以在 TypeScript 中获取联合的一部分的类型? 例如,您可以经常使用如下查找类型: interface Person { name: string; } type
我正在尝试设置 Point Cloud Library启用 CUDA 选项的主干构建。 我相信我已经按照 these instructions 正确安装了 CUDA . 在 PCL 构建的 cmake
我将首先说我所知道的唯一 VBA 是操作录制的宏的反复试验。我是一名注册会计师,试图以艰难的方式学习 VBA(并希望我去学校学习计算机编程!)。 我有带有多个工作表的大型工作簿。 G 列中以黄色突出显
当文件数达到阈值时,我试图删除目录中最旧的文件。 list_of_files = os.listdir('log') if len([name for name in list_of_files
我有一个数组,它有一些重复的值。 我必须计算每个重复项的数量及其索引。 打印如: Index of b: 1 Index of b: 4 Index of c: 2 Index of c: 3 Ind
我已经搜索了我的问题的解决方案,但没有成功。热键 ctrl+F 找到的 eclipse 查找/替换功能不起作用。注意:通过 Eclipse 菜单 Edit>Find Replace(不工作我的意思是
我想检查 div 是否包含类为“error”的子级,但条件是错误类显示不等于无。 (意味着错误类必须可见。 如何更改我的以下代码: $(".related_field").each(function
这个问题已经有答案了: 已关闭13 年前。 Possible Duplicate: Can jQuery provide the tag name? 嗨! 这个问题太基础了,我不好意思问,但我尝试了
我一直听说这是 cygwin 的路径问题。它阻止了 emacs 在我的 cygwin 中工作。当我在 cli(不是 bash/cygwin)上执行 find 时,无论我输入什么,我都会得到同样的错误。
我正在使用此变量来获取一个或多个与我需要的值相匹配的值。 var mail = $("#dat").contents().find("td:contains('" + name + "')" ).si
请原谅这个长问题。我只是不确定解决这个问题的最佳方法是什么。 我有一个电子表格(Google 表格),其中包含用户和地址列表,我需要从中创建邮寄标签。该电子表格是从我们的学生信息系统导出的。这些地址应
我正在 Excel VBA 中创建一个公式,以解析单元格中以逗号分隔的“部分”列表。在另一个工作表中查找具有该零件名称的单元格,然后使用找到的该单元格的地址来获取同一行不同列的零件成本。我为此工作了数
我被要求在网络应用程序上实现一些电子邮件地址验证 - 我确信我们都已经经历过一千次了...但是,这一次我被要求在域上进行 MX 查找查看它是否接受电子邮件。 有人知道这样做有任何潜在的问题吗? mx
我有一个切换按钮,可读取.wave文件,并且字符串更改为暂停,然后..... 我的问题是,当用户播放声音时,按钮字符串更改为暂停,结束声音后,该字符串仍为暂停状态,我想将其更改为播放。但是我不知道如何
对于令人困惑的标题提前表示歉意。我的问题如下,我在大约 600 个文件中有以下文本: $_REQUEST['FOO'] 我想将其替换为以下内容: $this->input->post('FOO') 为
我正在使用 Ansible 的查找功能查找 INI 文件中的值。这是文档中的示例: - debug: msg="User in integration is {{ lookup('ini', 'use
我是一名优秀的程序员,十分优秀!