【发布时间】:2019-06-16 23:15:00
【问题描述】:
阅读this question 及其答案后,我得出结论,这两种算法没有标准实现。不过先介绍一下背景:
我们大多数人都熟悉binarySearch。这个想法是,给定一个排序数组(或Collection,如果使用该类中的搜索工具),它可以有效地(以对数 - O(log2n) 时间)找到一个数组/集合中的给定元素。我提供的特定链接包含以下文档:
[...] 如果数组包含多个具有指定值的元素,则无法保证会找到哪一个。
有时,我们并不关心我们是否找到(或未能找到)我们感兴趣的元素的第一次或最后一次出现。但是如果我们确实关心呢?
如果我们在乎的话,我们会使用称为 lower bound 和 upper bound 的二分搜索的变体。它们分别返回给定元素的第一次和最后一次1。
我来自C++ 背景,我真的很喜欢这样一个事实,即我可以在容器。
最简单的用例是,给定一个排序集合,确定有多少元素等于x。我最初链接的问题中的This answer 包含以下内容:
[执行 binarySearch 之后] 然后继续线性迭代,直到到达相等范围的末尾。
问题是这个操作是线性的,对于随机访问的集合,我们可以做得更好——我们可以使用下限和上限,然后减去返回的索引,我们得到对数的结果,而不是线性,时间。
基本上,令我惊讶的是,Java 中没有实现上限和下限算法。我知道我可以自己轻松实现它们,但是,例如,如果我的数据存储在TreeMap 或TreeSet 中怎么办?它们不是随机访问的,但考虑到它们的实现,上限和下限可以很容易地作为它们的方法实现。
最后,我的问题是 - 在 Java 中是否有上限和/或下限的实现,最好是对 TreeSet 和 TreeMap 有效?
1不过,这取决于约定。在C++ 中,上限返回第一个大于的元素。
【问题讨论】:
标签: java binary-search treemap treeset