Skip to content

Commit

Permalink
lru cache
Browse files Browse the repository at this point in the history
  • Loading branch information
koyo922 committed Jul 27, 2019
1 parent 81f3cf4 commit d43acb1
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 0 deletions.
10 changes: 10 additions & 0 deletions kinoko/basic_algo/LRU_cache/__init__.py
@@ -0,0 +1,10 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 expandtab number
"""
TODO: module_docstring$ qianweishuo$ 2019/7/27
Authors: qianweishuo<qzy922@gmail.com>
Date: 2019/7/27 下午8:13
"""

59 changes: 59 additions & 0 deletions kinoko/basic_algo/LRU_cache/p146_lru_cache.py
@@ -0,0 +1,59 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 expandtab number
"""
运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。
获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。
进阶:
你是否可以在 O(1) 时间复杂度内完成这两种操作?
示例:
LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // 返回 1
cache.put(3, 3); // 该操作会使得密钥 2 作废
cache.get(2); // 返回 -1 (未找到)
cache.put(4, 4); // 该操作会使得密钥 1 作废
cache.get(1); // 返回 -1 (未找到)
cache.get(3); // 返回 3
cache.get(4); // 返回 4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lru-cache
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Authors: qianweishuo<qzy922@gmail.com>
Date: 2019/7/27 下午8:13
"""
from collections import OrderedDict


class LRUCache(object):

def __init__(self, capacity):
self.capacity = capacity
self.cache = OrderedDict()

def get(self, key):
if key in self.cache:
# 刷新一下位置
v = self.cache.pop(key)
self.cache[key] = v
return v
else:
return -1

def put(self, key, value):
# 注意判断,如果是新key而且已满,才需要抛出旧元素
if key in self.cache:
self.cache.pop(key)
elif len(self.cache) >= self.capacity:
self.cache.popitem(last=False)
self.cache[key] = value

0 comments on commit d43acb1

Please sign in to comment.