在Java中访问和检索已排序项的高效集合
在我的用例中,我有一个按升序排序的时间点集合在Java中访问和检索已排序项的高效集合,java,Java,在我的用例中,我有一个按升序排序的时间点集合 ArrayList<Double> times=new ArrayList<Double>(); Collections.sort(times); ArrayList times=new ArrayList(); 集合。排序(次); 我想使用一个有效的结构,当我给出一个任意的时间点(它可能不存在于列表中)时,它应该给出列表中最接近和最大的值,复杂性为O(1) 是否有任何结构或算法可用于上述操作?第一个明显的改进是使用双[]
ArrayList<Double> times=new ArrayList<Double>();
Collections.sort(times);
ArrayList times=new ArrayList();
集合。排序(次);
我想使用一个有效的结构,当我给出一个任意的时间点(它可能不存在于列表中)时,它应该给出列表中最接近和最大的值,复杂性为O(1)
是否有任何结构或算法可用于上述操作?第一个明显的改进是使用
双[]
,因为这将使用一小部分内存,并且具有更好的访问模式。这可以用于O(log N)
查找或最近搜索,这可能是您能达到的最佳效果
如果您使用散列映射,您可以得到O(1)查找,但这不会给出最接近的值。如果大多数查找都是完全匹配的,则可以先使用此方法,如果找不到匹配项,则可以使用二进制搜索
<>你也可以考虑将这些值按小时、分钟或秒顺序排列成“桶”。这将有助于降低时间复杂度,具体取决于您所做的假设。根据元素的自然顺序对元素进行排序,以便获得最大的元素。此外,它还定义了方法higher
和lower
,用于检索更接近的元素
话虽如此,文档说明
包含的操作的成本是O(logn),我认为这也适用于较高的和较低的,以便寻找正确的条目。感谢上面的评论,我将使用LongAVLTreeSet和LongRBTreeSet
我认为这些类在内存消耗和算术计算方面都给了我一个优化的性能。我不确定O(1)是否可行,二进制搜索的一个变体可以给你O(log(n))