LRU和AdMeta Cache

146. LRU缓存机制  面试题 16.25. LRU缓存

 1 class LRUCache {
 2     public class DlinkNode {
 3         private int key;
 4         private int val;
 5         private DlinkNode right;
 6         private DlinkNode left;
 7 
 8         public DlinkNode() {
 9         }
10 
11         public DlinkNode(int key, int value) {
12             this.key = key;
13             this.val = value;
14         }
15     }
16 
17     private Map<Integer, DlinkNode> map = new HashMap<>();
18     private DlinkNode head = new DlinkNode(-1, -1);
19     private DlinkNode tail = new DlinkNode(-1, -1);
20     private int capacity;
21 
22     public LRUCache(int capacity) {
23         this.capacity = capacity;
24         head.right = tail;
25         tail.left = head;
26     }
27 
28     public int get(int key) {
29         if (map.containsKey(key)) {
30             DlinkNode node = map.get(key);
31             updateNode(node);   //!!!
32             return map.get(key).val;
33         } else {
34             return -1;
35         }
36     }
37 
38     public void put(int key, int value) {
39         if (map.containsKey(key)) {
40             DlinkNode node = map.get(key);
41             node.val = value;
42             updateNode(node);  // !!! 注意更新结点位置
43         } else {
44             if (map.size() == capacity) {
45                 removeFromHead();
46             }
47             DlinkNode node = new DlinkNode(key, value);
48             addToTail(node);
49         }
50     }
51 
52     public void removeFromHead() {
53         DlinkNode del = head.right;
54         map.remove(del.key);
55         head.right = del.right;
56         del.right.left = head;
57         del = null;
58     }
59 
60     public void addToTail(DlinkNode node) {
61         map.put(node.key, node);
62         DlinkNode pre = tail.left;
63         pre.right = node;
64         node.left = pre;
65         node.right = tail;
66         tail.left = node;  // !!! 忘记这一句,调了一下午
67     }
68 
69     public void updateNode(DlinkNode node) {
70         DlinkNode left = node.left;
71         DlinkNode right = node.right;
72         left.right = right;
73         right.left = left;
74         addToTail(node);
75     }
76 } 

460. LFU缓存

猜你喜欢

转载自www.cnblogs.com/naonaoling/p/12408443.html
今日推荐