[英]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
查找的能力,則需要兩個數據結構;即,一個數據結構。 例如,共享它們的元素對象的TreeSet
和HashMap
。 假設存在隨機插入和/或隨機刪除, TreeSet
可能比嘗試維護ArrayList
更有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.