Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中访问和检索已排序项的高效集合_Java - Fatal编程技术网

在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))