【问题标题】:No guarantees for Arrays.BinarySearch?不能保证 Arrays.BinarySearch?
【发布时间】:2020-06-04 20:00:10
【问题描述】:

https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html

Sun 没有提到他们的二分搜索实现的任何复杂性。这是一个错误吗?我知道应该是O(logn),但是当他们没有明确说明这一点时,我会感到紧张。他们为他们的一些算法做,比如 Arrays.sort。

你们中有人知道实际的实现吗?我自己还没有机会下载源代码!我想这是一个微不足道的二分搜索,但 Sun 有时会调整算法以获得更好的性能。

【问题讨论】:

标签: java complexity-theory binary-search


【解决方案1】:

二分搜索的定义是 O(log n)(平均而言)猜测没有必要明确提及。

【讨论】:

  • 查看代码,即使数组未排序,显然也不会比 O(log n) 差。
  • @WizardOfOdds - 当然,你可能会得到错误的答案。
  • 如果数组未排序,doco 明确表示结果未定义。
【解决方案2】:

java.util.Array 的实现很简单,没有优化空间。

您可以在JAVA_HOME/src.zip 中找到源代码。 此类中的排序算法, 是使用二分搜索所必需的, 是一种优化的快速排序,可提供 n*log(n) 性能(在许多数据集上)。

【讨论】:

  • "该类中的排序算法,是使用二分查找所必需的..."。需要明确的是,您不需要使用Array.sort(...)。您可以确保使用任何有效的技术对数组进行排序!
  • 排序算法的复杂度和binarySearch的复杂度有什么关系呢?我也可以使用冒泡排序进行排序,然后使用 binarySearch 在 O(log n) 中查找元素。
  • 为了使用二分查找,必须对数组进行排序,因为我实际上是查看源代码,所以我只是添加了这个信息。
【解决方案3】:

Arrays.sort 保证返回一个排序后的数组,无论您的数组包含什么。

Arrays.binarySearch(...)(小写“b”顺便说一句)不能保证您的数组可能未排序。

现在编辑我的答案:查看代码显然不可能比 O(log n) 更差。但当然不能保证您会找到正确的值。

【讨论】:

    【解决方案4】:

    你们中有人知道实际的实现吗?

    您可以在自己的 JDK 安装中或使用 Google 搜索找到实际实现的源代码。例如,搜索“java.util.Arrays.java.html”。

    但我毫不怀疑 binarySearch 方法是O(logN)。如果他们不是有人会注意到......在过去 10 年左右的时间里。

    【讨论】:

      猜你喜欢
      • 2010-11-24
      • 2011-04-10
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多