jdk
中的實現
在jdk
中linkedhashmap
可以作為lru
演算法以及插入順序的實現,linkedhashmap
繼承自hashmap
,底層結合hash
表和雙向鍊錶,元素的插入和查詢等操作通過計算hash
值找到其陣列位置,在做插入或則查詢操作是,將元素插入到鍊錶的表頭(當然得先刪除鍊錶中的老元素),如果容量滿了,則刪除lru
這個元素,在煉表表尾的元素即是。
linkedhashmap
的時間複雜度和hashmap
差不多,雙向鍊錶的刪除和表頭插入等操作都是o
(1)複雜度,故不會影響hashmap的操作效能,插入,查詢,刪除lru
元素等操作均是o
(1)的時間複雜度。
linkedhashmap
不是執行緒安全的類,用於多執行緒快取則需要花點心思去同步它了,jdk
中有支援併發的高效能concurrenhashmap
,沒有concurrenlisthashmap
的實現,故要使用支援併發的高效能lru
演算法還得靠自己去繼承concurrenhashmap
或則其他方式實現。google
以及其它資深研發團隊已有concurrenlisthashmap
的實現當然知道了原理,我們自己也可以來實現lru
演算法1.
簡單的計數或則lu
時間標記法
底層使用hash
表,插入和訪問的時間都可以做到o
(1)複雜度,容量滿了需要刪除lru
,則需要遍歷一遍陣列,通過計數或則lu
時間得到lru
,刪除之,時間複雜度o
(n)。此演算法簡單容易實現,適合資料量不大的需求
2.通過棧或雙向鍊錶
這種演算法通過維護元素的在鍊錶中的順序來達到計算元素的訪問熱度,不需要額外的空間來計數或則記錄訪問時間。
插入時,先檢查改元素存在此煉表中沒有,有的刪除之,然後再將元素插入表頭。
訪問時,遍歷陣列查詢該元素,然後將該元素移動至表頭。
這樣一來,最近被訪問的元素都在表頭,故要找出lru
則只需要刪除表尾元素即可。插入和訪問的時間複雜度均為o
(n),如果用來作為快取(查詢操作頻繁),相比hash
表的實現,效能相當不好啊
3.結合hashmap
和雙向鍊錶
通過上面可知道hashmap
可實現讀寫o(1)
複雜度,但是找出lru
需要遍歷整個陣列,而通過維護鍊錶則相反,僅需要o
(1)就可以找出lru
,故將兩者結合起來,實現綜合複雜度為o
(1)的lru
演算法使用陣列來存放元素,插入時通過hash
計算出其位置,然後改變該元素在鍊錶中的指標,兩個操作的時間複雜度均為1
。具體實現可參考jdk
的linkedhashmap
LRU演算法的實現
0 推薦 lru演算法的實現 什麼是lru演算法lru是least recently used的縮寫,即最近最少使用頁面置換演算法,是為虛擬頁式儲存管理服務的.關於作業系統的記憶體管理,如何節省利用容量不大的記憶體為最多的程序提供資源,一直是研究的重要方向.而記憶體的虛擬儲存管理,是現在最通用,最成...
簡單實現演算法LRU
lru的主要思想基本是,設定乙個固定大小的容器,不斷新增元素。當容器放滿時,把最前面的元素清除,在對尾新增新元素,如果元素是重複的元素,則找出那個元素放到隊尾。lru演算法主要步驟是 1.判斷新元素的key是否在lru中,如果在,就把此元素找出來然後拿到鍊錶尾部 2.判斷元素是否填滿到指定大小,如果...
LRU演算法的實現
什麼是lru演算法?lru是least recently used的縮寫,即最近最少使用頁面置換演算法,是為虛擬頁式儲存管理服務的。關於作業系統的記憶體管理,如何節省利用容量不大的記憶體為最多的程序提供資源,一直是研究的重要方向。而記憶體的虛擬儲存管理,是現在最通用,最成功的方式 在記憶體有限的情況...