Advertisement
1sairandhri

LRU cache

Apr 3rd, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.89 KB | None | 0 0
  1. class DLinkedNode():
  2.     def __init__(self):
  3.         self.key = 0
  4.         self.value = 0
  5.         self.prev = None
  6.         self.next = None
  7.            
  8. class LRUCache():
  9.     def _add_node(self, node):
  10.         node.prev = self.head
  11.         node.next = self.head.next
  12.  
  13.         self.head.next.prev = node
  14.         self.head.next = node
  15.  
  16.     def _remove_node(self, node):
  17.         prev = node.prev
  18.         new = node.next
  19.  
  20.         prev.next = new
  21.         new.prev = prev
  22.  
  23.     def _move_to_head(self, node):
  24.         self._remove_node(node)
  25.         self._add_node(node)
  26.  
  27.     def _pop_tail(self):
  28.         res = self.tail.prev
  29.         self._remove_node(res)
  30.         return res
  31.  
  32.     def __init__(self, capacity):
  33.         self.cache = {}
  34.         self.size = 0
  35.         self.capacity = capacity
  36.         self.head, self.tail = DLinkedNode(), DLinkedNode()
  37.         self.head.next = self.tail
  38.         self.tail.prev = self.head
  39.        
  40.     def get(self, key):
  41.         node = self.cache.get(key, None)
  42.         if not node:
  43.             return -1
  44.         # move the accessed node to the head;
  45.         self._move_to_head(node)
  46.         return node.value
  47.  
  48.     def put(self, key, value):
  49.         node = self.cache.get(key)
  50.         if not node:
  51.             newNode = DLinkedNode()
  52.             newNode.key = key
  53.             newNode.value = value
  54.  
  55.             self.cache[key] = newNode
  56.             self._add_node(newNode)
  57.  
  58.             self.size += 1
  59.  
  60.             if self.size > self.capacity:
  61.                 # pop the tail
  62.                 tail = self._pop_tail()
  63.                 del self.cache[tail.key]
  64.                 self.size -= 1
  65.         else:
  66.             # update the value.
  67.             node.value = value
  68.             self._move_to_head(node)
  69. # Your LRUCache object will be instantiated and called as such:
  70. # obj = LRUCache(capacity)
  71. # param_1 = obj.get(key)
  72. # obj.put(key,value)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement