我有一个带时间戳的对象列表,我需要执行的唯一查询是“查找timsetamp大于x的所有对象”。 哪种数据结构最适合优化上述查找?我没有更长的插入时间,但如果可能的话,我宁愿不使用完整的EPL实现。
答案 0 :(得分:4)
如果您在某个应用程序中使用SQL数据库,则为时间戳字段创建一个索引,然后进行查询。
否则,如果您没有数据库,这看起来像是TreeMap或ConcurrentSkipList的作业。两者都实现subMap(K, K)中的headMap(K),tailMap(K)和NavigableMap interface方法。您可以通过在密钥中实现Comparable接口或在创建集合时指定Comparator来为任何SortedMap(及其子接口)指定自定义顺序。如果您不需要键值映射,也可以使用NavigableSet及其实现TreeSet或ConcurrentSkipListSet。
答案 1 :(得分:0)
您可以使用以下代码:
//declare an ArrayList of Objects
ArrayList<MyTimestampedObject> list = loadObjects();
//new list to store Objects after condition check
ArrayList<MyTimestampedObject> newList = new ArrayList<MyTimestampedObject>();
//loop through the list
for(MyTimestampedObject tmp:list ){
//check condition
if(tmp.getDate()>x){
//do something
newList.add(tmp);
}
}
答案 2 :(得分:0)
您可以使用任何允许二进制搜索的排序数据结构(如果您不关心插入时间),并且对于给定的X
,执行搜索(需要O(logN)
次)要找到第一个带有timestamp > X
的对象,因为数据结构是有序的,所以此对象之后的数据结构中的所有对象也都有timestamp > X
。
请注意,如果您要返回此查询中的对象列表,则无法完成O(N)
- 您将复制或删除O(N)
times,因为在一般情况下,此查询中可以检索的对象数为O(N)
。
答案 3 :(得分:0)
BST(二叉搜索树?InOrder如何使用O(logn)为您提供所需内容。