lru 這種算法通常用於緩存過時策略,這裏用一個hashmap和node這兩種數據結構實現,代碼以下java
import java.util.HashMap; import java.util.Map; public class LRU { private Node head;//記錄下一個要移除的node private Node end;//記錄插入的尾巴節點 private Map<String, Node> map=new HashMap<>();//加快查找速度,不用遍歷鏈表,時間複雜度爲O(1) private int limit;//最大容量 public LRU(int limit) { this.limit = limit; } public void add(String key , String val) { Node node = map.get(key); if(node == null){ if(map.size() >= limit){ map.remove(head.key); removeNode(head); } Node newNode = new Node(key, val); map.put(key,newNode); addNode(newNode); }else { reflush(node); } } @Override public String toString() { return "LRU{" + "map=" + map + ", limit=" + limit + '}'; } public void remove(String key) { Node node = map.remove(key); removeNode(node); } public String get(String key) { Node node = map.get(key); if(node == null){ return null; } reflush(node); return node.val; } private void reflush(Node node) { if(node == end){ return; } removeNode(node); addNode(node); } private void removeNode(Node node) { boolean isHeadOrEnd=false; if(node == end){ end=end.pre; isHeadOrEnd=true; } if(node == head){ head=head.next; isHeadOrEnd=true; } if(isHeadOrEnd){ return; } if(node.next != null){ node.next.pre=node.pre; } if(node.pre != null){ node.pre.next=node.next; } } private void addNode(Node newNode) { if(end != null){ end.next=newNode; newNode.pre=end; } end=newNode; if(head == null){ head=end; } } } /*這裏用雙向隊列,在移除時須要改變node的指向,若是不是雙端隊列,會比較麻煩*/ class Node{ public String key; public String val; public Node pre; public Node next; public Node(String key, String val) { this.key = key; this.val = val; } }
參考node