您的位置:首页 > 其它

LRUCache LeetCode OJ

2015-09-09 00:00 288 查看
摘要: 参考了网上一些代码,用python实现的LRU算法缓存器

# 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: