开发者社区> 问答> 正文

LRU 缓存机制

题目:LRU 缓存机制 设计和实现一个 LRU(最近最少使用)缓存数据结构,使它应该支持一下操作:get 和 put。 get(key) - 如果 key 存在于缓存中,则获取 key 的 value(总是正数),否则返回 -1。 put(key,value) - 如果 key 不存在,请设置或插入 value。当缓存达到其容量时,它应该在插入新项目之前使最近最少使用的项目作废。

出题人:文景/阿里云 CDN 资深技术专家

展开
收起
Runt 2020-04-14 16:47:15 2663 0
1 条回答
写回答
取消 提交回答
  • 参考答案:

    python版本的:

        def __init__(self, capacity):
        """
        :type capacity: int
        """
        self.cache = {}
        self.keys = []
        self.capacity = capacity
        
        def visit_key(self, key):
            if key in self.keys:
                self.keys.remove(key)
            self.keys.append(key)
        
        def elim_key(self):
            key = self.keys[0]
            self.keys = self.keys[1:]
            del self.cache[key]
            
        def get(self, key):
            """
            :type key: int
            :rtype: int
            """
            if not key in self.cache:
                return -1
            self.visit_key(key)
            return self.cache[key]
        
        def put(self, key, value):
            """
            :type key: int
            :type value: int
            :rtype: void
            """
            if not key in self.cache:
            if len(self.keys) == self.capacity:
            self.elim_key()
            self.cache[key] = value
            self.visit_key(key)
    
    def main():
        s =
        [["put","put","get","put","get","put","get","get","get"],[[1,1],[2,2],[1],[3,3],[2],[
        4,4],[1],[3],[4]]]
        obj = LRUCache(2)
        l=[]
        for i,c in enumerate(s[0]):
            if(c == "get"):
                l.append(obj.get(s[1][i][0]))
            else:
                obj.put(s[1][i][0], s[1][i][1])
        print(l)
    
    if __name__ == "__main__":
        main()
    
    

    c++版本的:

        public:
            LRUCache(int capacity) {
                cap = capacity;
            }
            
            int get(int key) {
                auto it = m.find(key);
                if (it == m.end()) return -1;
                l.splice(l.begin(), l, it->second);
                return it->second->second;
            }
            
            void set(int key, int value) {
                auto it = m.find(key);
                if (it != m.end()) l.erase(it->second);
                l.push_front(make_pair(key, value));
                m[key] = l.begin();
                if (m.size() > cap) {
                    int k = l.rbegin()->first;
                    l.pop_back();
                    m.erase(k);
                }
            }
    }
    
    
    2020-04-14 16:52:36
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
基于英特尔 SSD 的虚拟机缓存解决SSD 立即下载
用户态高速块缓存方案 立即下载
高性能Web架构之缓存体系 立即下载