lru快取策略
為最近最少使用(lru)快取
策略設計乙個資料結構,它應該支援以下操作:獲取資料(get
)和寫入資料(set)。
獲取資料get(key)
:如果快取中存在key,則獲取其資料值(通常是正數),否則返回-1。
寫入資料set(key, value)
:如果key還沒有在快取中,則寫入其資料值。當快取達到上限,它應該在寫入新資料之前刪除最近最少使用的資料用來騰出空閒位置。
您在真實的面試中是否遇到過這個題?
yes
樣例標籤
相關題目
分析:為了保持cache的效能,使查詢,插入,刪除都有較高的效能,我們使用雙向鍊錶(std::list)和雜湊表(std::unordered_map)作為cache的資料結構,因為:
具體實現細節:
這裡上三種方法,前兩種基本一樣,不過第一種加了好多只有我自己能看懂的注釋。。。
方法一:
class lrucache
// @return an integer
int get(int key)
// @param key, an integer
// @param value, an integer
// @return nothing
void set(int key, int value)
}private:
int cap;//容器容量
list> l;//用雙鏈表表示這個資料結構,pair兩個分別表示key 和value
unordered_map>::iterator> m;//用雜湊表輔助以便在o(1)時間找到目標項
};
方法二:
struct cachenode
};class lrucache
int get(int key)
}void set(int key, int value)
//插入新節點到鍊錶頭部,並且更新map中增加該節點
cachelist.push_front(cachenode(key, value));
cachemap[key] = cachelist.begin();
}else
}private:
listcachelist;
unordered_map::iterator>cachemap;
int size;
};
方法三:自己實現乙個雙向鍊錶
struct node
int key;
int value;
node*pre;
node*next;
};
class lrucache
// @return an integer
int get(int key)
else
return ret;
} }
// @param key, an integer
// @param value, an integer
// @return nothing
void set(int key, int value)
if(m.find(key)==m.end())
else
head->value = value; //這個一定需要,因為set可能會相同的key 而value不同
} if(size>capacity)
} private:
int capacity;
int size;
node*head;
node*tail;
unordered_mapm;
};
HTTP 快取策略
瀏覽器一般快取 css js等靜態檔案,因為這些檔案的更新頻率相對來說比較低,合理利用瀏覽器的快取對 的效能提公升有很大幫助。http快取分為兩部分,分別是本地快取和快取協商,當本地快取不生效時會啟用快取協商。http快取主要由http協議的頭 header 資訊來制定。本地快取 本地快取是指瀏覽器...
LRU快取策略
為最近最少使用 lru 快取策略設計乙個資料結構,它應該支援以下操作 獲取資料 get 和寫入資料 set 獲取資料get key 如果快取中存在key,則獲取其資料值 通常是正數 否則返回 1。寫入資料set key,value 如果key還沒有在快取中,則寫入其資料值。當快取達到上限,它應該在寫...
HTTP快取策略
瀏覽器一般快取 css js等靜態檔案,因為這些檔案的更新頻率相對來說比較低,合理利用瀏覽器的快取對 的效能提公升有很大幫助。http快取分為兩部分,分別是本地快取和快取協商,當本地快取不生效時會啟用快取協商。http快取主要由http協議的頭 header 資訊來制定。本地快取是指當瀏覽器請求資源...