【问题标题】:Searching LinkedHashMap, faster method than sequential?搜索 LinkedHashMap,比顺序更快的方法?
【发布时间】:2013-08-08 01:16:04
【问题描述】:

我想知道是否有更有效的方法可以从我的 LinkedHashMap 中获取时间戳大于指定时间的对象。 IE。比以下更好的东西:

    Iterator<Foo>  it = foo_map.values().iterator();
    Foo foo;

    while(it.hasNext()){
        foo = it.next();
        if(foo.get_timestamp() < minStamp) continue;

        break;
    }

在我的实现中,我的每个对象基本上都具有三个值:“id”、“timestamp”和“data”。这些对象是按照它们的时间戳顺序插入的,所以当我在集合上调用迭代器时,我会得到有序的结果(根据链接的 hashmap 合约的要求)。地图以对象的 id 为键,因此我可以通过 id 快速查找它们。

但是,当我通过时间戳条件查找它们时,我会得到一个带有排序结果的迭代器。这是对通用哈希图的改进,但我仍然需要在大部分范围内按顺序迭代,直到找到具有比指定时间戳更高的时间戳的下一个条目。

由于结果已经排序,是否有任何算法可以传递迭代器(或集合到),它可以比顺序搜索更快?如果我使用树形图作为替代方案,它会提供整体速度优势,还是在后台做本质上相同的事情?由于集合已经按插入顺序排序,我认为树形图有很多我不需要的开销?

【问题讨论】:

    标签: java iterator treemap linkedhashmap


    【解决方案1】:

    没有更快的方法...如果您只使用LinkedHashMap

    如果您想要更快的访问,您需要使用不同的数据结构。例如,带有适当比较器的TreeSet 可能是您问题的这方面的更好解决方案。例如,如果您的 TreeSet 按日期排序,则使用适当的虚拟值调用 tailSet 可以为您提供大于或等于给定日期的所有元素。


    由于结果已经排序,是否有任何算法可以传递迭代器(或集合),比顺序搜索更快?

    不适用于LinkedHashMap

    但是,如果有序列表是ArrayList,那么您可以在列表上使用“二分搜索”...前提是您可以锁定它以防止在搜索时进行并发修改。 (实际上,无论您如何实现并发性都是一个需要考虑的潜在问题……包括您当前的线性搜索。)


    如果你想保持id查找的能力,那么你需要两个数据结构;例如TreeSetHashMap 共享它们的元素对象。假设存在随机插入和/或随机删除,TreeSet 可能比尝试维护ArrayList 更有效。

    【讨论】:

    • 数据被锁定,所以并发不是问题。是的,二分搜索将是一个巨大的改进,但我不能放弃 id 映射。
    • 我认为两个数据结构可以做到这一点。一个常规的旧哈希图和数组列表,其中包含仅包含 id 和时间戳的对象。删除对象会有点棘手,因为它需要搜索数组列表来删除相应的时间戳。但我认为时间戳搜索会快得多。
    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2016-01-30
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多