# LRUCache
class DictMap:
def __init__(self):
self.dict = {}
self.size = 0
def set(self, key, value):
self.size+=1
self.dict[key] = value
def get(self, key):
value = None
if(self.containKey(key)):
value = self.dict[key]
return value
def remove(self, key):
del self.dict[key]
self.size-=1
def containKey(self, key):
try:
self.dict[key]
return True
except:
return False
class Entry:
def __init__(self, k, v):
self.k = k
self.v = v
self.pre = None
self.next = None
class LRUCache(object):
def __init__(self, capacity):
self.c = capacity
self.m = DictMap()
self.head = Entry(-1, -1)
self.tail = Entry(1, 1)
self.head.next = self.tail
self.tail.pre = self.head
def get(self, key):
if(self.m.containKey(key)):
e = self.m.get(key)
self.__moveToHead(e)
return e.v
else:
return -1
def set(self, key, value):
if(self.m.containKey(key)):
e = self.m.get(key)
e.v = value
self.__moveToHead(e)
elif(self.m.size<self.c):
e = Entry(key, value)
self.__moveToHead(e)
self.m.set(key, e)
else:
e = Entry(key, value)
self.__moveToHead(e)
self.m.set(key, e)
index = self.__removeEnd()
self.m.remove(index)
def __removeEnd(self):
e = self.tail.pre
self.tail.pre.pre.next = self.tail
self.tail.pre = e.pre
e.pre = None
e.next = None
return e.k
def __moveToHead(self, e):
if(e.next!=None and e.pre!=None):
e.pre.next = e.next
e.next.pre = e.pre
e.pre = self.head
e.next = self.head.next
self.head.next.pre = e
self.head.next = e
转载于:https://my.oschina.net/joshuashaw/blog/503983