在我的用例中,我有一组时间点,按升序排序。
ArrayList<Double> times=new ArrayList<Double>();
Collections.sort(times);
我想使用一个有效的结构,当我给出一个任意时间点(它可能不存在于列表中)时,它应该给出列表中最接近和最大的值,其中O(1)复杂度。
是否有可用于上述的结构或算法?
答案 0 :(得分:3)
第一个明显的改进是使用double[]
,因为这将使用一小部分内存并具有更好的访问模式。这可以用于O(log N)
查找或最近搜索,这可能是您可以实现的最佳搜索。
如果您使用哈希映射,您可以获得O(1)查找,但这不会给您最近的值。如果您的大部分查找都是完全匹配,那么您可以先使用此匹配,如果找不到匹配项,则可以使用二进制搜索。
您还可以考虑将值分配到小时,分钟或秒的“桶”中。这将有助于减少时间复杂度,具体取决于您做出的假设。
答案 1 :(得分:1)
TreeSet根据其自然顺序对元素进行排序,因此您可以获得最大的元素。此外,它定义了方法higher
和lower
,它们可以检索更接近的元素。
话虽如此,文档指出contains
操作的成本是O(log N),我认为它也适用于higher
和lower
,给定{{3}寻找合适的条目。
答案 2 :(得分:0)
感谢您的上述评论,我将使用fastutill collection,例如LongAVLTreeSet和LongRBTreeSet。
我认为这些类在内存消耗和算术计算方面给出了优化的性能。