最近师兄碰到一道面试题,一起做了做,题目本来是java的,但师兄面试的岗位其实是python,所以我们用python进行了实现。
题目:
运用你所掌握的数据结构,设计和实现一个LRU(最近最少使用)缓存机制。它应该支持以下操作:获取数据get和写入数据put。
具体思路与java实现见:https://zhuanlan.zhihu.com/p/34133067
下面是python实现:
class DLinkedNode(object):
def __init__(self, key, value):
self.key = key
self.value = value
# 前驱
self.pre = None
# 后继
self.post = None
def __init__(self):
self.key = None
self.value = None
# 前驱
self.pre = None
# 后继
self.post = None
class LRUCache():
def __init__(self, capacity): # 构造函数
self.count = 0
self.capacity = capacity
self.head = DLinkedNode()
self.tail = DLinkedNode()
self.head.post = self.tail
self.tail.pre = self.head
self.cache = {
}
def out(self):
p = self.head
while p.post != None:
if p.value != None:
print(p.value)
p = p.post
def get(self, key):
node = self.cache[key]
if node == None:
return "raise exception"
self.moveToHead(node)
return node.value
def set(self, key, value):
try:
node = self.cache[key]
except KeyError:
newNode = DLinkedNode()
newNode.key = key
newNode.value = value
self.cache[key] = newNode
self.addNode(newNode)
self.count = self.count + 1
if self.count > self.capacity:
t = self.popTail()
self.cache.pop(t.key)
self.count = self.count - 1
else:
node.value = value
self.moveToHead(node)
def removeNode(self, node):
pre = DLinkedNode()
post = DLinkedNode()
pre = node.pre
post = node.post
pre.post = post
post.pre = pre
def addNode(self, node):
node.pre = self.head
node.post = self.head.post
self.head.post.pre = node
self.head.post = node
def moveToHead(self, node):
self.removeNode(node)
self.addNode(node)
def popTail(self):
res = self.tail.pre
self.removeNode(res)
return res
if __name__ == '__main__':
l = LRUCache(3)
l.set("key1", 7);
l.set("key2", 0);
l.set("key3", 1);
l.set("key4", 2);
l.get("key2")
l.set("key5", 3)
l.get("key2")
l.set("key6", 4)
l.out();