數據結構和算法之LRU緩存淘汰算法

思路:

維護一個有序單鏈表,越靠近鏈表尾部的結點是越早之前訪問的。當有一個新的數據被訪問時,我們從鏈表頭開始順序遍歷鏈表。

  1. 如果此數據之前已經被緩存在鏈表中了,我們遍歷得到這個數據對應的結點,並將其從原來的位置刪除,然後再插入到鏈表的頭部。
  2. 如果此數據沒有在緩存鏈表中,又可以分爲兩種情況:如果此時緩存未滿,則將此結點直接插入到鏈表的頭部;如果此時緩存已滿,則鏈表尾結點刪除,將新的數據結點插入鏈表的頭部。

這裏可以用Java LinkedHashMap集合來實現

/**
 * 寫字樓裏寫字間,寫字間里程序員
 * 程序人員寫程序,又拿程序換酒錢
 */
public class LRUCache<K,V> extends LinkedHashMap<K,V> {
    private final int  MAX_SIZE;

    public LRUCache(int cacheSize){
        // true 表示讓 linkedHashMap 按照訪問順序來進行排序,最近訪問的放在頭部,最老訪問的放在尾部。
        super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
        MAX_SIZE = cacheSize;
    }

    @Override
    public boolean removeEldestEntry(Map.Entry<K,V> eldest){
        return size() > MAX_SIZE;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章