用于访问和检索Java中的已排序项的高效集合

时间:2017-04-24 08:50:39

标签: java

在我的用例中,我有一组时间点,按升序排序。

ArrayList<Double> times=new ArrayList<Double>();
Collections.sort(times);

我想使用一个有效的结构,当我给出一个任意时间点(它可能不存在于列表中)时,它应该给出列表中最接近和最大的值,其中O(1)复杂度。

是否有可用于上述的结构或算法?

3 个答案:

答案 0 :(得分:3)

第一个明显的改进是使用double[],因为这将使用一小部分内存并具有更好的访问模式。这可以用于O(log N)查找或最近搜索,这可能是您可以实现的最佳搜索。

如果您使用哈希映射,您可以获得O(1)查找,但这不会给您最近的值。如果您的大部分查找都是完全匹配,那么您可以先使用此匹配,如果找不到匹配项,则可以使用二进制搜索。

您还可以考虑将值分配到小时,分钟或秒的“桶”中。这将有助于减少时间复杂度,具体取决于您做出的假设。

答案 1 :(得分:1)

TreeSet根据其自然顺序对元素进行排序,因此您可以获得最大的元素。此外,它定义了方法higherlower,它们可以检索更接近的元素。

话虽如此,文档指出contains操作的成本是O(log N),我认为它也适用于higherlower,给定{{3}寻找合适的条目。

答案 2 :(得分:0)

感谢您的上述评论,我将使用fastutill collection,例如LongAVLTreeSet和LongRBTreeSet。

我认为这些类在内存消耗和算术计算方面给出了优化的性能。