classNode(object):def__init__(self, results):
self.results = results
self.prev =None
self.next=NoneclassLinkedList(object):del __init__(self):
self.head =None
self.tail =Nonedefmove_to_front(self, node):# ...defappend_to_front(self, node):# ...defremove_from_tail(self):# ...classCache(obejct):def__init__(self, MAX_SIZE):
self.MAX_SIZE = MAX_SIZE
self.size =0
self.lookup ={}
self.linked_list = LinkedList()defget(self, query)'''
Get the stored query result from the cache
Accsssing a node updates its position to the front of the LRU list
'''
node = self.lookup.get(query)if node isNone:returnNone
self.linked_list.move_to_front(node)return node.results
defset(self, resuts, query):'''Set the results for the given query key in the cache.
When updating an entry, updates its position to the front of the LRU list
If the entry is new and the cache is at capacity, remove the oldest entry before the new entry is added '''
node = self.lookup.get(query)if node isnotNone:
node.results = results
self.linked_list.move_to_front(node)else:if self.size == self.MAX_SIZE
self.lookup.pop(self.linked_list.tail.query,None)
self.linked_list.remove_from_tail()else:
self.size +=1
new_node = Node(results)
self.linked_list.append_to_front(new_node)
self.lookup[query]= new_node