【问题标题】:Usage examples of binary search二分查找的使用示例
【发布时间】:2011-02-10 07:14:30
【问题描述】:

我刚刚意识到,在我 4 年多的 Java 编程(主要是桌面应用程序)中,我从未将 Arrays 类中的二进制搜索方法用于任何实际操作。一次都没有。我能想到的一些原因:

  1. 在 100% 的情况下,您可以使用线性搜索、地图或其他非二分搜索。
  2. 传入的数据几乎从未排序,要对其进行排序需要额外的排序步骤。

所以我想知道是不是只有我一个人,还是很多人从不使用二分搜索?二分搜索有哪些好的实用示例?

【问题讨论】:

  • 我投票决定以重复的形式关闭。然而,这个问题的优点在于它解决了数据尚未排序这一点。我能想到的二进制搜索、霍夫曼树等的大多数用途是数据已经以硬烘焙格式呈现(尽管它与 MPEG 文件一样常见)。
  • @Vijay - 不是重复的。该问题正在讨论二叉树。 OP 的问题是,如果这些数组操作可以很容易地被二叉树和其他非数组优点取代,为什么它们如此受欢迎。

标签: java arrays binary-search


【解决方案1】:

在桌面上,您可能只是在处理用户的数据,这些数据可能并没有那么大。如果您正在查询由许多用户共享的非常大的数据集,那么它可能是另一回事。很多人不一定直接处理二进制搜索,但任何使用数据库的人都可能隐式使用它。例如,如果您使用 AppEngine,数据存储区查询几乎肯定会使用二进制搜索。

【讨论】:

  • @python 老兄,你如何在地图中找到钥匙?请记住,数据可能无法放入内存。您可能希望通过二分搜索找到第一个匹配的表条目(在磁盘上),然后将该范围加载到内存中。
  • 我希望 B-tree 比二叉树存储更多。二叉树似乎更具学术性或预先烘焙的静态数据。
【解决方案2】:

我会说它归结为:

如果我们要进行二分搜索,我们将有一个搜索关键字。如果我们有一个键,我们可能使用的是映射而不是数组。

还有一个非常重要的事情要记住:

二分搜索是一个明确的例子,说明像一个优秀的程序员一样思考与像一个普通人一样思考是多么不同。这是认知飞跃之一,它让您真正考虑将传统上以 n 顺序完成的操作(当由人类完成时)并将其降低到 lg-n 时间。这使得它非常非常有用,即使它从未在生产代码中使用过。

【讨论】:

    【解决方案3】:

    我几乎从不使用二分搜索。

    但我愿意:

    • 我需要多次搜索同一个列表
    • 列表足够长,导致性能问题(尽管我经常犯微优化)

    但是,我经常使用哈希表/字典进行快速查找。

    【讨论】:

      【解决方案4】:

      对于我日常工作中的生产代码,到目前为止,SetMap 总是足够好的。

      对于我为了好玩而解决的算法问题,二分搜索是一种非常有用的技术。对于初学者,如果元素集永远不会改变(即,您永远不会在被查询的集合中插入或删除元素)Map/Set 与二进制搜索相比没有优势 - 并且对简单数组的二进制搜索避免了与查询更复杂的数据结构相关的大量开销。在许多情况下,我发现它实际上比 HashMap 更快。

      二分搜索也是一种比仅查询集合中的成员更通用的技术。可以对任何单调函数执行二进制搜索,以找到该函数满足特定条件的值。你可以找到更详细的解释here。但正如我所说,我的工作并没有提出足够多的涉及计算的问题以使其适用。

      【讨论】:

        【解决方案5】:

        假设您必须在列表中搜索一个元素。

        你可以使用线性搜索,你会得到O(n)

        或者,您可以通过最快的算法 (O(log n)*n) 和二进制搜索 (O(log n)) 对其进行排序。你会得到 O((log n)*n + log n)

        这意味着在搜索大列表时,二分查找更好。另外,它取决于列表的数据结构。如果列表是基于链接的列表,则二分搜索是不好的做法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-10
          相关资源
          最近更新 更多