2008-11-07 73 views
11

我正在尋找一個類似於散列表的操作的數據結構,但表中有一個大小限制。當哈希中的項目數量達到大小限制時,應調用一個剔除函數來擺脫表中最少檢索的鍵/值對。什麼是類似散列表的數據結構類型,但不常用的鍵會被刪除?

這裏是我工作的一些僞代碼:

class MyClass { 
    private Map<Integer, Integer> cache = new HashMap<Integer, Integer>(); 
    public int myFunc(int n) { 
    if(cache.containsKey(n)) 
     return cache.get(n); 
    int next = . . . ; //some complicated math. guaranteed next != n. 
    int ret = 1 + myFunc(next); 
    cache.put(n, ret); 
    return ret; 
    } 
} 

什麼情況是,也有n一些值,這myFunc()將被稱爲很多次,但n許多其他值這將只計算一次。因此,緩存可能會填充數百萬個不再需要的值。我想有一種方法讓緩存自動刪除不經常檢索的元素。

這感覺就像一個必須解決的問題,但我不確定數據結構是什麼,我會用它來有效地做到這一點。任何人都可以將我指向正確的方向嗎?


更新我知道這必須是一個已經解決的問題。它被稱爲LRU緩存,並且通過擴展LinkedHashMap類很容易實現。這裏是一個融合解決方案的代碼:

class MyClass { 
    private final static int SIZE_LIMIT = 1000; 
    private Map<Integer, Integer> cache = 
    new LinkedHashMap<Integer, Integer>(16, 0.75f, true) { 
     protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) 
     { 
     return size() > SIZE_LIMIT; 
     } 
    }; 
    public int myFunc(int n) { 
    if(cache.containsKey(n)) 
     return cache.get(n); 
    int next = . . . ; //some complicated math. guaranteed next != n. 
    int ret = 1 + myFunc(next); 
    cache.put(n, ret); 
    return ret; 
    } 
} 
+0

另請參閱http://stackoverflow.com/questions/224868/easy-simple-to-use-lru-cache-in-java。 – 2008-11-07 17:05:49

回答

17

你正在尋找一個LRUList/Map聽起來相當多的地方。檢出LinkedHashMap

可能會覆蓋removeEldestEntry(Map.Entry)方法,強制執行策略,以便在將新映射添加到地圖時自動刪除過時映射。

0

看看WeakHashMap中

+0

這不完全是我想要的。據我所知,一個弱哈希映射僅僅意味着映射中鍵的存在不會被視爲對該對象的引用,所以垃圾收集器仍然可以將其刪除。由於我使用整數,所以無法確定這是否符合我的要求。 – Kip 2008-11-07 17:00:09

1

WeakHashMap中可能不會做你期望它......仔細閱讀文檔,並確保你確切地知道你從弱和強的參考。

我建議你看看java.util.LinkedHashMap並使用它的removeEldestEntry方法來維護你的緩存。如果你的數學是非常耗費資源的,那麼你可能會希望將條目移到前面,只要它們用於確保只有未使用的條目落在該集合的末尾。

4

谷歌搜索「LRU圖」和「手氣不錯」給你:

http://commons.apache.org/proper/commons-collections//javadocs/api-release/org/apache/commons/collections4/map/LRUMap.html

一個Map實現與刪除至少 最近使用的條目;如果不固定 最大尺寸在完整時添加條目是 。

上:)

+0

謝謝,如果你已經知道答案是「LRU map」,但是如果你已經知道你不需要找到答案的話,那真的很容易找到答案。 :) – Kip 2008-11-07 17:04:13

+0

是的,對不起,並沒有試圖變得sn。。我意外地擊中了「我感到幸運」:) – 2008-11-07 17:15:49

1

Adaptive Replacement Cache政策旨在保持一次性請求從污染緩存。這可能比你想要的更有趣,但它確實直接解決了你的「充滿了不再需要的價值」。

相關問題