我刚才意识到,在我4年多的Java编程(主要是桌面应用程序)中,我从来没有在Arrays类中使用二进制搜索方法来实现任何实际操作。从来没有。我能想到的一些原因:
所以我想知道这只是我,还是很多人从不使用二分搜索?什么是二进制搜索的一些好的,实用的例子?
答案 0 :(得分:5)
在桌面上,您可能只是处理用户的数据,这可能不是那么大。如果您要查询非常大的数据集(由许多用户共享),那么它可能是另一回事。很多人不一定直接处理二进制搜索,但使用数据库的任何人都可能隐式使用它。例如,如果使用AppEngine,数据存储区查询几乎肯定会使用二进制搜索。
答案 1 :(得分:3)
我想说的归结为:
如果我们要进行二分搜索,我们将有一个搜索的密钥。如果我们有一个键,我们可能使用的是地图而不是数组。
要记住另一件非常重要的事情:
二元搜索是一个明确的例子,说明像一个好的程序员一样思考与像普通人一样思考。这是一种认知上的飞跃,使你真正考虑采取传统上完成的操作(当由人类完成时)按顺序进行并将其降至有序时间。这使它非常非常有用,即使它从未在生产代码中使用过。
答案 2 :(得分:1)
我几乎没有,如果使用二进制搜索。
但我想:
但是,我经常使用哈希表/字典进行快速查找。
答案 3 :(得分:1)
对于我日常工作中的生产代码,到目前为止Set
或Map
总是足够好。
对于我解决的算法问题,二元搜索是一种非常有用的技术。对于初学者来说,如果元素集永远不会改变(即你永远不会在被查询的集合中插入或删除元素),Map
/ Set
没有优于二分搜索的优势 - 并且二元搜索在一个简单的数组上避免了与查询更复杂的数据结构相关的大量开销。在许多情况下,我发现它实际上比HashMap
更快。
二进制搜索也是一种比仅查询集合中的成员资格更通用的技术。可以对任何单调函数执行二进制搜索,以找到函数满足特定标准的值。您可以找到更详细的解释here。但正如我所说,我的工作方式并没有带来足够的计算上涉及的问题,因此适用。
答案 4 :(得分:0)
假设您必须搜索列表中的元素。
您可以使用线性搜索,您将获得 O(n)。
或者,您可以通过最快的算法(O(log n)* n)和二进制搜索(O(log n))对其进行排序。你会得到 O((log n)* n + log n)。
这意味着在搜索大型列表时,二进制搜索更好。此外,它取决于列表的数据结构。如果list是基于链接的列表,则二进制搜索是不好的做法。