這是乙個什麼演算法?
這是乙個可以處理程式過多的情況下該刪除哪乙個程式的演算法策略。它是根據最近使用時間來進行確定的,通常刪除的是最後乙個節點。
那麼這個演算法會涉及什麼樣的資料結構?
這個演算法涉及了hashmap和雙向鍊錶的資料結構,通過這兩個結構的配合可以通過map來快速定位訪問節點,通過雙向鍊錶來快速增刪節點。
首先我們來講講原生**是如何實現的(這裡參考的是labuladong老師的解法)
其實原生**的實現就是我們自己來創造乙個雙向鍊錶,然後加上乙個hashmap來配合演算法的使用。雙向鍊錶的實現非常簡單,只需要乙個頭結點和尾節點,並且有增刪改和size()的功能就可以了。另外還需要乙個node類來儲存鍵值對,這個是方便對資料的儲存。
接下來需要說的就是lru演算法的重點,也就是lru的get和put方法,因為我們實際上是在get和put上面加上了手腳,讓這個演算法能夠訪問資料的時候根據使用的時間進行淘汰。而在寫get和put方法之前,需要幾個方法來對hashmap與雙向鍊錶對資料的增刪改進行操作,避免get和put直接接觸到資料,這樣可以減少**量,也可以保證自己寫錯的機會減少。因為有時候寫著寫著就可能忘了map也需要增刪資料。首先需要乙個makerencently(key)的方法用於調整資料的儲存的位置,調整到最近使用的位置,簡單來說就是剛剛使用了這個資料,那麼就要把這個資料的位置調整到剛加入的位置(通常這個位置在鍊錶的尾節點),然後第二個方法deletekey(int key)就是刪除節點,需要刪除map也要刪除雙向鍊錶裡面的資料。第三個方法removeleastrecently()就是刪除距離使用時間最遠的那個,比如按順序使用程式1、2、3,我們就會發現1就是距離使用時間最晚的那個,3就是最近使用的,2就是排在了中間。所以我們如果加入4那麼就要先刪除1。
接觸資料的方法寫完就能直接寫get和put了。get比較簡單,只需要判斷是否有key,沒有就返回-1,有的話,就需要呼叫makerecently調整位置,然後再返回val。
put相對比較麻煩。首先就是判斷是否有這個key,有的話就要重新賦值,並且調整位置。沒有的話就需要判斷容量是否滿了,滿的話就需要刪除距離最遠的那個,然後再加入新的節點。
**
class
lrucache';
}private hashmap
map;
private doublelist cache;
private
int capacity;
public
lrucache
(int capacity)
//新增新的節點
public
void
put(
int key,
int val)
if(capacity==cache.
size()
)addrecently
(key,val);}
/** * 使用這個節點,並且設定為最近使用
* @param key
* @return
*/public
intget
(int key)
makerecently
(key)
;return map.
get(key)
.val;
}//把先把一些增刪操作放進乙個方法裡面隱藏
//重新排序
private
void
makerecently
(int key)
//新增最近使用的元素
private
void
addrecently
(int key,
int val)
//刪除節點
private
void
deletekey
(int key)
//刪除最久沒有使用過的那個
private
void
removemaxdistance()
}class
doublelist
return
"doublelist';}
//頭結點和尾節點
private node head,tail;
//節點個數
private
int size;
public
doublelist()
//把節點加入到最後
public
void
addlast
(node x)
//移除乙個節點
public
void
remove
(node x)
//移除第乙個節點
public node removefirst()
node first=head.next;
remove
(first)
;return first;
}//返回大小
public
intsize()
}//雙向鍊錶的節點
class
node';
}public
node
(int key,
int val)
}
快取淘汰演算法 LRU
1.lru 1.1.原理 lru least recently used,最近最少使用 演算法根據資料的歷史訪問記錄來進行淘汰資料,其核心思想是 如果資料最近被訪問過,那麼將來被訪問的機率也更高 1.2.實現 最常見的實現是使用乙個鍊錶儲存快取資料,詳細演算法實現如下 1.新資料插入到鍊錶頭部 2....
LRU 快取淘汰演算法
1.介紹 lru是leastrecentlyused近期最少使用演算法。記憶體管理的一種頁面置換演算法,對於在記憶體中但又不用的資料塊 記憶體塊 叫做lru,oracle會根據哪些資料屬於lru而將其移出記憶體而騰出空間來載入另外的資料。lru least recently used,最近最少使用 ...
快取淘汰演算法LRU
least recently used,即最近最少使用,是記憶體管理的一種頁面置換演算法。演算法的核心是 如果乙個資料在最近一段時間內沒有被訪問到,那麼它在將來被訪問的可能性也很小。換言之,當記憶體達到極限時,應該把記憶體中最久沒有被訪問的資料淘汰掉。理論上只需要乙個列表,資料被使用時,不在lru列...