如何實現乙個lru呢?如果使用雙向鍊錶+hash實現。
首先需求清楚:
什麼是lru;
需要哪些支援知識;
怎麼使用這些基礎知識實現;
如果高併發下怎麼辦;
反思一些基礎知識。
什麼是lru:
就是最近最少訪問。
需要哪些支援知識:
那是不是就想起了linked。為什麼沒有使用linkedlist呢?而是使用linkedmaphash。
我覺得:
linkedmaphash:就是linkedlist+hashmap。 linkedlist用來維護順序,hashmap用來儲存資料。通過維護乙個執行於所有條目的雙向鍊錶,linkedhashmap保證了元素迭代的順序。該迭代順序可以是插入順序或者是訪問順序。
怎麼使用這些基礎知識實現
參考:
思路:可以順序查詢;
訪問不過是插入還是查詢都可以,該值自動放到第一位,後面的值自動後退移位;
怎麼做到上述點呢?如果使用linkedmaphash貌似一下就解決了。
linkedhashmap accessorder設為true,按照訪問順序排序
但是如果讓自己實現呢?
public class lrucache
/**
* 獲取快取中物件,並把它放在最前面
*/
public entry get(object key) else
} /**
* 新增 entry到hashtable, 並把entry
*/
public void put(object key, object value) else
node = new entry();
} node.value = value;
//將最新使用的節點放到煉表頭,表示最新使用的.
movetohead(node);
nodes.put(key, node);
} /**
* 將entry刪除, 注意:刪除操作只有在cache滿了才會被執行
*/
public void remove(object key)
if (node.next != null)
if (last == node)
last = node.prev;
if (first == node)
first = node.next;
} //在hashtable中刪除
nodes.remove(key);
} /**
* 刪除鍊錶尾部節點,即使用最後 使用的entry
*/
private void removelast()
} /**
* 移動到煉表頭,表示這個節點是最新使用過的
*/
private void movetohead(entry node)
first = node;
node.prev = null;
if (last == null)
last = first;
} /*
* 清空快取
*/
public void clear()
} class entry
思路就是:雙鏈表 + hashtable實現
為什麼要用hashtable呢?
我覺得還是hashmap也行。
在這個**中:雙向鍊錶是自定義的:
class entry {
entry prev;//前一節點
entry next;//後一節點
object value;//值
object key;//鍵
主要核心邏輯是被當訪問後,需要將此值放到頭部。
實現**:movetohead
LRU快取替換演算法介紹與程式設計實現
快取中容量是有限的,當要查詢的資料不在快取中時,我們要用新資料替換掉 部分原有得資料,有很多種替換策略,lru就是最近最少使用的被替換,我們想要 將來被使用的資料保留下來,但我們不知道將來會使用那些資料,就按照最近使用資料近似將來也會使用的資料。我們要如何體現最近最少使用呢?採用乙個佇列,新加入的資...
LRU快取機制實現
題目描述 設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 set key,value 將記錄 key,value 插入該結構 get key 返回key對應的value值 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key...
快取 LRU演算法實現
以下是基於雙向鍊錶 hashmap的lru演算法實現,對演算法的解釋如下 設定乙個map存放對應的鍵和值,同時設定乙個雙向鍊錶,來儲存最近最久未使用的關係,如果訪問乙個鍵,鍵存在於map中,訪問完成後,我們在鍊錶中將該鍵刪除,然後將其新增到鍊錶的首部,表示最近剛訪問過這個鍵,當快取滿了後,如果要新增...