数据结构 - 当找不到键时,java.util.Collections.binarySearch 返回值背后的原因是什么?



从文档中引用它说java.util.Collections.binarySearch(List<? extends Comparable<? super T>> list, T key)返回。。。

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

我的问题是,定理(-(insertion point) - 1)有什么意义(如果有的话),以至于它是找不到键时的返回值?为什么不直接返回insertion point呢?

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

好吧,为什么不只是-insertion point呢?想象一下,如果插入点是0(搜索到的元素比所有现有元素都小),那么逻辑就会中断——找不到将返回一个非负数。因此产生了额外的CCD_ 5。

好吧,为什么不总是-1呢?

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

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

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

而且,按照二进制搜索的工作方式,算法在索引终止时就知道这个索引,所以为什么不在不需要额外费用的情况下共享它呢?

从相同的文档中,如果键存在,则返回值必须>=0。如果所有元素都大于键,则insertion point可能为零,即使键不存在,也会导致返回值为零。另一方面,值(-(insertion point) - 1)总是小于零。

请注意,这保证了当且仅当找到键时,返回值将>=0。

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

最新更新