# -*- coding: utf-8 -*-
'''
Python程序员面试算法宝典---解题总结: 第二章 栈、队列与哈希 2.8 如何实现LRU缓存方案
题目:
LRU就是最近最少使用,请实现。
分析:
最近最少使用实际就是在缓存不够的时候将最先进入的删除掉,那么这就可以使用队列完成。
将需要删除的最前面的n个元素删除即可。
使用双向链表来实现队列,队列最大容量为缓存大小。把最近使用的页面移动到队列头,
最近没有使用的放在队列尾部。
使用哈希表,建立: <页号,队列中该页面对应节点地址>的节点字典。
当引用页面在队列中,则将页面对应节点移动到队列头部,
否则,将一个新节点添加到队列前面,并更新节点字典。
若队列已经满了,那么就从队列尾部移除一个节点,并将新节点添加到队列前面
关键:
1 缓存有大小
最近访问的页面需要放置到队列头部;
队列满,需要移除队尾元素;
需要建立字典保存<页号,队列中页面对应节点地址>
参考:
Python程序员面试算法宝典
'''
from collections import deque
class LRU(object):
def __init__(self, cacheSize):
self.cacheSize = cacheSize
self.queue = deque()
self.hashSet = set()
def full(self):
return len(self.queue) >= self.cacheSize
def enQueue(self, data):
# 如果待入队元素在队列中,则移动到队头
if data in self.hashSet:
self.queue.remove(data)
self.queue.appendleft(data)
else:
self.hashSet.add(data)
# 如果队列已经满了,则先移除队尾的元素,然后将待入队元素放入队头
if self.full():
self.queue.pop()
self.queue.appendleft(data)
def deQueue(self):
self.queue.pop()
def deQueueRemove(self, data):
self.queue.remove(data)
def printLRU(self):
info = ""
for value in self.queue:
if info:
info += " " + str(value)
else:
info += str(value)
print info
def process():
cacheLRU = LRU(3)
cacheLRU.enQueue(1)
cacheLRU.enQueue(2)
cacheLRU.enQueue(3)
cacheLRU.enQueue(1)
cacheLRU.enQueue(6)
cacheLRU.enQueue(7)
cacheLRU.printLRU()
if __name__ == "__main__":
process()