每位程序员都被教导二进制搜索是一种搜索有序数据列表的好方法。有许多玩具教科书使用二进制搜索的例子,但在实际编程中呢:二进制搜索在现实生活中实际使用的是什么?
答案 0 :(得分:27)
二进制搜索无处不在。从任何语言库(Java,.NET,C ++ STL等)获取任何已排序的集合,他们都将使用(或可以选择使用)二进制搜索来查找值。虽然你必须很少实现它,但你仍然必须理解它背后的原理才能利用它。
答案 1 :(得分:20)
当内存空间紧张时,二进制搜索可用于快速访问有序数据。假设您要在可搜索的有序数据结构中存储一组100.000个32位整数,但您不会经常更改该集合。您可以将整数存储在400.000字节的排序数组中,并且可以使用二进制搜索快速访问它。但如果你把它们放在进入B树,RB树或任何“更动态”的数据结构,你开始招致内存开销。为了说明,将整数存储在您已经离开子指针和右子指针的任何类型的树中将使您消耗至少1.200.000字节的内存(假设32位内存架构)。当然,你可以做一些优化,但这就是它的工作原理。
因为更新有序数组(进行插入或删除)非常慢,所以当数组经常更改时,二进制搜索没有用。
这里有一些我使用二进制搜索的实际例子:
答案 2 :(得分:15)
每个程序员在调试时都需要知道如何使用二进制搜索。
当你有一个程序时,你知道某个特定点可以看到一个bug 在执行程序期间,您可以使用二进制搜索来精确定位 实际发生的地方。这可以比单步执行快得多 大部分代码。
答案 3 :(得分:7)
二进制搜索 是一种快捷方式!
在STL和.NET框架等到来之前,您经常遇到需要滚动自定义集合类的情况。每当排序数组成为存储数据的可行位置时,二进制搜索将是定位该数组中条目的方式。
我非常确定二进制搜索现在也在广泛使用,尽管图书馆为了您的方便而对其进行了“引人注目”的处理。
答案 4 :(得分:6)
我在BTree实现中实现了二进制搜索。
BTree搜索算法用于查找要读取的下一个节点块,但是在4K块本身内(其中包含基于密钥大小的多个键),二进制搜索用于查找记录号(对于叶节点)或下一个块(对于非叶节点)。
与顺序搜索相比,速度快,因为与平衡二叉树一样,每次检查都会删除剩余搜索空间的一半。
答案 5 :(得分:3)
用动手实例回答你的问题。
在R编程语言中有一个包data.table。从C实现的,短语法,高性能的数据转换扩展已知。它使用二进制搜索。即使没有二元搜索,它也比竞争对手更好地扩展
您可以在项目维基grouping 2E9中找到基准vs python pandas 和vs R dplyr - 随机订单数据。
还有一个很好的基准vs数据库vs bigdata benchm-databases。
在最近的data.table版本(1.9.6)中,扩展了二进制搜索,现在可以用作任何原子列的索引。
我刚刚找到一个很好的总结,我完全同意 - see。
任何进行R比较的人都应该使用data.table而不是data.frame。基准测试更是如此。 data.table是我职业生涯中发现的最好的数据结构/查询语言。它以“R世界”和“我的方式”引领着所有以数据为中心的语言。
所以是的,正在使用二进制搜索,并且由于它,世界变得更好。
答案 6 :(得分:3)
我曾经实现过它(甚至不知道这确实是二元搜索),用于显示图形中二维数据的GUI控件。单击鼠标应将数据光标设置为具有最接近x值的点。当处理大量的点(几千个,当x86刚刚开始超过100 MHz的CPU频率时就回来了)这不是真正可用的交互式 - 我从一开始就进行了线性搜索。经过一番思考后,我发现我可以分而治之地解决这个问题。花了我一些时间让它在所有边缘情况下工作。
过了一段时间,我才知道这确实是一个基本的CS算法......
答案 7 :(得分:3)
我们仍然在我们的代码中大量使用它来每秒搜索数千个ACLS数千次。它很有用,因为ACL一旦从文件进入就是静态的,我们可能会因为我们在启动时添加它而承担增长数组的费用。一旦运行也会非常快。
当您可以搜索最多7个比较/跳跃的255个元素数组(8个中的511个,9个中的1023个等)时,您可以看到二进制搜索的速度与您获得的速度一样快。
答案 8 :(得分:2)
嗯,binary search现在用于99%的3D游戏和应用程序。空间分为树形结构,二元搜索用于检索根据3D位置和摄像机显示的细分。
它的第一个最伟大的展示之一是毁灭战士。二叉树和相关搜索增强了渲染效果。
答案 9 :(得分:2)
二进制搜索可用于使用Git进行调试。它被称为git bisect。
答案 10 :(得分:2)
一个例子是stl集。底层数据结构是一个平衡的二进制搜索树,它支持由于二进制搜索而在O(log n)中查找,插入和删除。
另一个例子是在日志时间内运行的整数除法算法。
答案 11 :(得分:1)
在其他地方,我有一个带有命令名表的解释器和一个指向解释该命令的函数的指针。大约有60个命令。使用线性搜索不会太令人费解 - 但我使用二分搜索。
答案 12 :(得分:1)
用于测量数字时序或模拟电平的半导体测试程序广泛使用二进制搜索。来自Advantest,Teradyne,Verigy等的自动测试设备(ATE)可以被认为是真值表爆破器,应用输入逻辑和验证数字部件的输出状态。
考虑一个简单的门,输入逻辑在每个周期的时间= 0时改变,并在输入逻辑改变后转换X ns。如果在T = X之前选通输出,则逻辑与预期值不匹配。频闪晚于时间T = X,逻辑确实匹配预期值。二进制搜索用于查找逻辑不匹配的最新值与其最早部分之间的阈值。(Teradyne FLEX系统将时序分解为39pS分辨率,其他测试仪具有可比性)。这是衡量转换时间的简单方法。可以使用相同的技术来解决设置时间,保持时间,可操作电源电平,电源与延迟等问题。
任何类型的微处理器,存储器,FPGA,逻辑和许多模拟混合信号电路都在测试和表征中使用二进制搜索。
- 迈克
答案 13 :(得分:1)
我有一个程序遍历一个集合来执行一些计算。我认为这是低效的,所以我对集合进行了排序,然后使用单个二进制搜索来查找感兴趣的项目。我退回了这个项目及其匹配的邻居。我实际上过滤了该集合。
这样做实际上比迭代整个集合并捕获匹配的项目要慢。
我继续向集合添加项目,因为知道排序和搜索性能最终会赶上迭代。它收集了大约600个物体,直到速度相同。 1000个对象具有明显的性能优势。
我还会考虑您正在使用的数据类型,重复和传播。这将对排序和搜索产生影响。
我的回答是尝试两种方法并计算时间。
答案 14 :(得分:1)
答案 15 :(得分:1)
二进制排序可用于将字体调整为具有文本框常量维度的文本大小
答案 16 :(得分:0)
找到一个方程的根源可能是你想用一个非常简单的算法如二进制搜索做的那些非常简单的事情之一。
答案 17 :(得分:0)
Delphi使用可以在排序的TStringList中搜索字符串时享受二进制搜索。
答案 18 :(得分:0)
我相信.NET SortedDictionary
在幕后使用二叉树(很像STL图)...所以二进制搜索用于访问SortedDictionary
答案 19 :(得分:0)
Python的list.sort()
方法使用Timsort,其中(AFAIK)使用二进制搜索来定位元素的位置。
答案 20 :(得分:0)
二进制搜索提供了许多现成的地图/字典实现不具备的功能:查找非完全匹配。
例如,我使用二进制搜索来实现基于GPS日志的照片地理标记:将所有GPS航点放在按时间戳排序的数组中,并使用二进制搜索来识别与每张照片的时间戳最接近的航点
答案 21 :(得分:-1)
如果要在数组中找到一组元素,则可以线性搜索每个元素,也可以对数组进行排序,然后使用具有相同比较谓词的二分查找。后者要快得多。