題目說明
運用你所掌握的數據結構,設計和實現一個 LRU (最近最少使用) 緩存機制。它應該支持以下操作: 獲取數據 get 和 寫入數據 put 。
獲取數據 get(key) - 如果關鍵字 (key) 存在於緩存中,則獲取關鍵字的值(總是正數),否則返回 -1。
寫入數據 put(key, value) - 如果關鍵字已經存在,則變更其數據值;如果關鍵字不存在,則插入該組「關鍵字/值」。當緩存容量達到上限時,它應該在寫入新數據之前刪除最久未使用的數據值,從而爲新的數據值留出空間。
進階:
你是否可以在 O(1) 時間複雜度內完成這兩種操作?
解題思路一
- LRU緩存機制,可以自行百度一下。
- 特點1,hash表讀取數據
- 特點2,存在一個
keys
序列,代表緩存的所有key
,順序按照最近的活躍度
來排序,比如你剛剛
用過key爲1
的值,那麼1
就會排在keys序列
的第一
位。當緩存超出
的時候,會優先刪除keys
的末尾
。
- 所以我們主要維護了一個hash,js中就是一個對象,用來存數據。一個序列也就是一個數組存keys。
- get:如果將get的key,位置置換到首位。並返回數據。
- put:將put設置的值的key,放在keys序列首位,判斷是否超出,超出則刪除最後一位。
代碼實現一
var LRUCache = function(capacity) {
this.obj = {};
this.objKeys = [];
this.limit = capacity;
};
LRUCache.prototype.get = function(key) {
if (this.obj[key]) {
this.objKeys.splice(this.objKeys.indexOf(key), 1);
this.objKeys.unshift(key);
return this.obj[key];
} else {
return -1
}
};
LRUCache.prototype.put = function(key, value) {
this.obj[key] && this.objKeys.splice(this.objKeys.indexOf(key), 1);
this.objKeys.unshift(key);
this.obj[key] = value;
if (this.objKeys.length > this.limit) {
delete this.obj[this.objKeys[this.limit]];
this.objKeys.length -= 1;
}
};