實現lru 緩存
思路:用map+鏈表實現,map用來提高查詢速度,鏈表用來存放元素。鏈表頭放入最新的元素,表尾為最老元素。訪問cache命中,或者cache滿寫入時都需要對鏈表內容和map進行調整。
JDK里面有一個LinkedHashMap就是基于這個思路實現的。
LRU Cache
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.
get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
Show Tags
</div>
</div>
</div>
public class LRUCache {
static class Node {
int key;
int value;
@Override
public String toString() {
return "Node{" +
"key=" + key +
", value=" + value +
'}';
}
}
static private LinkedList<Node> cache;
static private int cap;
static private Node indexMap[];
public LRUCache(int capacity) {
cache = new LinkedList<Node>();
indexMap = new Node[100000];
cap = capacity;
}
static public boolean isFull() {
return cache.size() == cap;
}
static public Node find(int key) {
if (cache.isEmpty())
return null;
Node tar = null;
if ((tar = indexMap[key]) == null)
return null;
cache.remove(tar);
cache.addFirst(tar);
return tar;
}
public int get(int key) {
Node node = find(key);
if (node == null) {
return -1;
}
return node.value;
}
public void set(int key, int value) {
Node node = null;
if ((node = find(key)) != null) {
node.value = value;
return;
}
//not find the element
if (isFull()) {
indexMap[cache.getLast().key] = null;
cache.removeLast();
}
Node newNode = new Node();
newNode.key = key;
newNode.value = value;
cache.addFirst(newNode);
indexMap[key] = newNode;
}
} </pre>
本文由用戶 cnp5 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!