簡體   English   中英

搜索LinkedHashMap,比順序更快的方法?

[英]Searching LinkedHashMap, faster method than sequential?

我想知道是否有一種更有效的方法來從時間戳大於指定時間的LinkedHashMap中獲取對象。 即比以下更好:

    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”。 對象是按其時間戳的順序插入的,因此,當我在集合上調用迭代器時,將獲得有序的結果(按鏈接的哈希映射協定的要求)。 映射鍵為對象的ID,因此我可以通過ID快速查找它們。

但是,當我通過時間戳條件查詢它們時,會得到帶有排序結果的迭代器。 這是對通用哈希圖的改進,但是我仍然需要在大部分范圍內順序迭代,直到找到下一個時間戳比指定時間戳更高的下一個條目。

由於結果已經排序,是否有任何算法可以將迭代器(或集合)傳遞給迭代器(或集合),以使其比順序搜索更快? 如果我使用樹形圖作為替代方案,它將提供整體速度優勢,還是在后台執行基本相同的操作? 由於該集合已經按插入順序排序,因此我認為樹圖有很多不必要的開銷嗎?

沒有更快的方法……如果您僅使用LinkedHashMap

如果要更快地訪問,則需要使用其他數據結構。 例如,對於您的問題的這一方面,帶有適當比較器的TreeSet可能是更好的解決方案。 例如,如果您的TreeSet是按日期排序的,則使用適當的啞數值調用tailSet可以為您提供大於或等於給定日期的所有元素。


由於結果已經排序,是否有任何算法可以將迭代器(或集合)傳遞給迭代器(或集合),以使其比順序搜索更快?

不適用於LinkedHashMap

但是,如果有序列表不是ArrayList ,則可以在列表上使用“二進制搜索” ...,前提是可以鎖定它以防止在搜索時進行並發修改。 (實際上,並發性是一個潛在的問題,無論您如何實現它(包括當前的線性搜索)。


如果要保持執行id查找的能力,則需要兩個數據結構;即,一個數據結構。 例如,共享它們的元素對象的TreeSetHashMap 假設存在隨機插入和/或隨機刪除, TreeSet可能比嘗試維護ArrayList更有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM