leetcode_146_LRU緩存機制

leetcode 146 LRU緩存機制

  • 題目
    運用你所掌握的數據結構,設計和實現一個  LRU (最近最少使用) 緩存機制。它應該支持以下操作: 獲取數據 get 和 寫入數據 put 。
    
    獲取數據 get(key) - 如果密鑰 (key) 存在於緩存中,則獲取密鑰的值(總是正數),否則返回 -1。
    寫入數據 put(key, value) - 如果密鑰已經存在,則變更其數據值;如果密鑰不存在,則插入該組「密鑰/數據值」。當緩存容量達到上限時,它應該在寫入新數據之前刪除最久未使用的數據值,從而爲新的數據值留出空間。
    
    進階:
    
    你是否可以在 O(1) 時間複雜度內完成這兩種操作?
    
    示例:
    
    LRUCache cache = new LRUCache( 2 /* 緩存容量 */ );
    
    cache.put(1, 1);
    cache.put(2, 2);
    cache.get(1);       // 返回  1
    cache.put(3, 3);    // 該操作會使得密鑰 2 作廢
    cache.get(2);       // 返回 -1 (未找到)
    cache.put(4, 4);    // 該操作會使得密鑰 1 作廢
    cache.get(1);       // 返回 -1 (未找到)
    cache.get(3);       // 返回  3
    cache.get(4);       // 返回  4
    
    1. 哈希表+雙鏈表
      import java.util.Map;
      import java.util.HashMap;
      
      class DLink {
          protected int key;
          protected int value;
          protected DLink pre;
          protected DLink next;
      
          public DLink() {
              this.key = 0;
              this.value = 0;
              this.pre = null;
              this.next = null;
          }
      
          public DLink(int key, int value) {
              this.key = key;
              this.value = value;
              this.pre = null;
              this.next = null;
          }
      }
      
      public class LRUCache {
          private int capacity;
          private DLink head, tail;
          private Map<Integer, DLink> Lt = new HashMap<Integer, DLink>();
      
          public LRUCache(int capacity) {
              this.capacity = capacity;
              head = new DLink();
              tail = new DLink();
              head.next = tail;
              tail.pre = head;
          }
      
          public int get(int key) {
              DLink node = this.Lt.get(key);
              if (node == null) return -1;
              else {
                  node.pre.next = node.next;
                  node.next.pre = node.pre;
                  node.pre = tail.pre;
                  node.next = tail;
                  node.pre.next = node;
                  tail.pre = node;
                  return node.value;
              }
      
          }
      
          public void put(int key, int value) {
              DLink node = this.Lt.get(key);
              if (node == null) {
                  node = new DLink(key, value);
                  if (this.Lt.size() < this.capacity) {
                      node.pre = tail.pre;
                      node.next = tail;
                      node.pre.next = node;
                      tail.pre = node;
                      Lt.put(key, node);
                  } else {
                      Lt.remove(head.next.key);
                      head.next.next.pre = head;
                      head.next = head.next.next;
                      node.pre = tail.pre;
                      node.next = tail;
                      node.pre.next = node;
                      tail.pre = node;
                      Lt.put(key, node);
                  }
              } else {
                  node.value = value;
                  node.pre.next = node.next;
                  node.next.pre = node.pre;
                  node.pre = tail.pre;
                  node.next = tail;
                  node.pre.next = node;
                  tail.pre = node;
              }
          }
      }
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章