lintcode LRU快取策略

2021-08-07 19:32:05 字數 1963 閱讀 6326

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 資訊來制定。本地快取是指當瀏覽器請求資源...