【问题标题】:Is there a proper upperBound and lowerBound for Collection and/or Arrays in Java?Java中的集合和/或数组是否有适当的上限和下限?
【发布时间】:2019-06-16 23:15:00
【问题描述】:

阅读this question 及其答案后,我得出结论,这两种算法没有标准实现。不过先介绍一下背景:

我们大多数人都熟悉binarySearch。这个想法是,给定一个排序数组(或Collection,如果使用该类中的搜索工具),它可以有效地(以对数 - O(log2n) 时间)找到一个数组/集合中的给定元素。我提供的特定链接包含以下文档:

[...] 如果数组包含多个具有指定值的元素,则无法保证会找到哪一个。

有时,我们并不关心我们是否找到(或未能找到)我们感兴趣的元素的第一次或最后一次出现。但是如果我们确实关心呢?

如果我们在乎的话,我们会使用称为 lower boundupper bound 的二分搜索的变体。它们分别返回给定元素的第一次和最后一次1

我来自C++ 背景,我真的很喜欢这样一个事实,即我可以在容器。

最简单的用例是,给定一个排序集合,确定有多少元素等于x。我最初链接的问题中的This answer 包含以下内容:

[执行 binarySearch 之后] 然后继续线性迭代,直到到达相等范围的末尾。

问题是这个操作是线性的,对于随机访问的集合,我们可以做得更好——我们可以使用下限和上限,然后减去返回的索引,我们得到对数的结果,而不是线性,时间。

基本上,令我惊讶的是,Java 中没有实现上限和下限算法。我知道我可以自己轻松实现它们,但是,例如,如果我的数据存储在TreeMapTreeSet 中怎么办?它们不是随机访问的,但考虑到它们的实现,上限和下限可以很容易地作为它们的方法实现。

最后,我的问题是 - 在 Java 中是否有上限和/或下限的实现,最好是对 TreeSetTreeMap 有效?


1不过,这取决于约定。在C++ 中,上限返回第一个大于的元素。

【问题讨论】:

    标签: java binary-search treemap treeset


    【解决方案1】:

    TreeSet.floor()TreeSet.ceiling() 不是您要的吗?

    或者,或者,higher()lower(),如果您希望排除相等性。

    【讨论】:

    • 关于Tree-family 有点公平,但标准呢,Collection 问题的一部分?
    • 另外,将它与TreeMap 一起使用怎么样?获取密钥然后将它们与get 一起使用似乎很浪费。
    • TreeMap.floorEntryceilingEntry 获取键值对。
    • Collection而言,Collection不需要具有自然顺序,因此界面中不存在需要顺序的操作。或者我想是这样的;设计师没有问我:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多