当没有找到密钥时,java.util.Collections.binarySearch返回值背后的原因是什么?

时间:2015-06-28 19:44:17

标签: java data-structures binary-search

引自docs它说java.util.Collections.binarySearch(List<? extends Comparable<? super T>> list, T key)返回...

  

搜索键的索引(如果它包含在列表中);   否则,( - (插入点) - 1)。插入点定义为将密钥插入列表的点:   第一个元素的索引大于键,或者list.size()if   列表中的所有元素都小于指定的键...

我的问题是,定理(-(insertion point) - 1)具有什么重要性(如果有的话),以至于当找不到密钥时它是返回值?为什么不直接返回insertion point

3 个答案:

答案 0 :(得分:3)

首先,如果找不到元素,则必须根据文档返回负值,否则无法区分找到和未找到。

好的,为什么不只是-insertion point?想象一下,如果插入点为0(搜索到的元素小于所有现有元素),则该逻辑将中断 - 未找到将返回非负数。因此额外的-1

好的,为什么不只是-1

因为知道排序列表中不匹配的插入点对于查找问题的答案很有用,例如:

  

下一个比我要求的更大的元素是什么?

  

有多少元素比我(没有找到)的元素大?

而且,二进制搜索的工作方式,算法在终止时知道这个索引,那么为什么不在没有额外费用的情况下分享它呢?

答案 1 :(得分:0)

在相同的文档中,如果密钥存在,则返回值必须为&gt; = 0。如果所有元素都大于键,则insertion point可以为零,即使该键不存在,也会返回零值。另一方面,值(-(insertion point) - 1)始终小于零。

  

请注意,当且仅当找到密钥时,这可以保证返回值为> = 0.

答案 2 :(得分:0)

这是一种将两个用例组合成一个方法调用的方法。 List.indexOf()和类似的方法只会在找不到元素时返回-1,但是Collections.binarySearch()更进了一步并返回一个负数,当你按元素构建一个有序列表元素时它也很有用