Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get
and set
.
get(key)
- Get the value (will always be positive) of the key if the key exists
in the cache, otherwise return -1.
set(key, value)
- Set or insert the value if the key is not already present.
When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
基本思路:
用一个map处理查找问题。
用list维护按使用元素排序。将近期被訪问的记录,总是移动到链表头。
list中存储的是[key, value],
而map中存储的是key, 以及在list中相应节点的iterator。
在将list中的元素移动到最前时,使用了splice函数。 此函数比先删除,再插入,要高效。
此代码在leetcode上实际运行时间为160ms。
class LRUCache{ public: LRUCache(int capacity) :capacity_(capacity) { } int get(int key) { auto iter = cache_.find(key); if (iter == cache_.end()) return -1; lru_.splice(lru_.begin(), lru_, iter->second); return iter->second->second; } void set(int key, int value) { if (get(key) != -1) { lru_.front().second = value; return; } if (lru_.size() == capacity_) { cache_.erase(lru_.back().first); lru_.pop_back(); } lru_.push_front(make_pair(key, value)); cache_[key] = lru_.begin(); } private: typedef list<pair<int, int> > list_t; typedef unordered_map<int, list_t::iterator> map_t; list_t lru_; map_t cache_; const int capacity_; };
版权声明:本文博主原创文章。博客,未经同意不得转载。