每个程序员都知道二分搜索是在有序数据列表中搜索的一种好的、快速的方法。有许多玩具教科书示例使用二分搜索,但在实际编程中呢:二分搜索在哪些真实的程序中实际使用?
每个程序员都知道二分搜索是在有序数据列表中搜索的一种好的、快速的方法。有许多玩具教科书示例使用二分搜索,但在实际编程中呢:二分搜索在哪些真实的程序中实际使用?
二分查找(Binary search)被广泛应用在IT技术中。无论是Java、.NET、C++ STL等任何语言库中的排序集合,都会使用(或提供使用)二分查找来查找值。尽管很少需要自己实现,但仍需理解其原理以最大化利用。
二分查找可以在内存空间有限的情况下快速访问有序数据。假设您想要将一组100,000个32位整数存储在可搜索、有序的数据结构中,但您不经常更改该集合。您可以轻松地将整数存储在一个排序的400,000字节数组中,并且您可以使用二分查找快速访问它。但是,如果您将它们放入B树、红黑树或任何“更动态”的数据结构中,您就开始产生内存开销。例如,将整数存储在任何具有左子节点和右子节点指针的树中,将使您至少消耗1,200,000字节的内存(假设32位内存架构)。当然,您可以进行优化,但这通常是其工作原理。
由于更新有序数组(执行插入或删除)非常缓慢,因此在数组经常更改时二分查找不是很有用。
以下是我使用二分查找的一些实际示例:
二分查找是一种好的、快速的方法!
在STL和.NET框架等到来之前,您经常需要自己编写定制的集合类。每当一个排序数组可以成为存储数据的可行位置时,二分查找就是在该数组中定位条目的方式。
我相信今天二分查找仍然广泛使用,尽管由于库的便利性,它被“后台处理”了。
我曾经在一个显示二维图形数据的GUI控件中实现了它(甚至不知道这实际上是二分查找)。点击鼠标应该将数据光标设置到最接近x值的点。当处理大量点(几千个,在x86只有100 MHz CPU频率的早期),这并不是真正可交互的 - 我从开始做线性搜索。经过一些思考,我意识到我可以采用分治法来解决这个问题。花了我一些时间才让它在所有边缘情况下都能正常工作。
只有一段时间后我才知道这确实是一种基本的计算机科学算法......
任何进行R比较的人都应该使用data.table而不是data.frame。特别是在基准测试方面。在我的职业生涯中,我发现data.table是最好的数据结构/查询语言。它在R世界中引领潮流,并且在所有数据重点语言中都是如此。
所以是的,二分查找正在被使用,世界因此变得更美好。
现在,在99%的3D游戏和应用程序中都使用二分查找。空间被划分为一棵树结构,使用二分查找来检索根据3D位置和相机要显示哪些细分。
其中最早的展示之一是《毁灭战士》。二叉树和相关搜索增强了渲染效果。
一个例子是stl set。其底层数据结构是平衡二叉搜索树,由于二分查找支持O(log n)的查找、插入和删除。
另一个例子是一个整数除法算法,它以对数时间运行。