Guest User

Untitled

a guest
Mar 21st, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.02 KB | None | 0 0
  1. class Node():
  2. def __init__(self, key, value, next=None, prev=None):
  3. self.key = key
  4. self.value = value
  5. self.next = next
  6. self.prev = prev
  7.  
  8. def __str__(self):
  9. return '<{}:{}>'.format(self.key, self.value)
  10.  
  11. def __repr__(self):
  12. return self.__str__()
  13.  
  14. class DoublyLinkedList():
  15. """ [head] <-> [] <-> [] <-> [tail]
  16. """
  17.  
  18. def __init__(self):
  19. self.head = None
  20. self.tail = None
  21. self.current = self.head
  22.  
  23. def append(self, node):
  24. if self.head is None:
  25. self.head = self.tail = node
  26. else:
  27. # repair the chain
  28. node.prev = self.tail
  29. self.tail.next = node
  30. # insert the new node
  31. self.tail = node
  32.  
  33. def remove(self, node):
  34. cur = self.head
  35. while cur is not None:
  36. if cur == node:
  37. if cur.prev is not None:
  38. cur.prev.next = cur.next
  39. cur.next.prev = cur.prev
  40. else:
  41. self.head = cur.next
  42. cur.next.prev = None
  43. cur = cur.next
  44.  
  45. class LRUCache():
  46. def __init__(self, size=3):
  47. self.size = size
  48. self.cache = {}
  49. self.eviction_order = DoublyLinkedList()
  50.  
  51. def get(self, key):
  52. node = self.cache[key]
  53. self.eviction_order.remove(node)
  54. self.eviction_order.append(node)
  55. return node
  56.  
  57. def set(self, key, value):
  58. node = Node(key, value)
  59. if len(self.cache.keys()) < self.size:
  60. self.cache[key] = node
  61. self.eviction_order.append(node)
  62.  
  63. elif len(self.cache.keys()) >= self.size:
  64. del self.cache[self.eviction_order.head.key]
  65. self.eviction_order.remove(self.eviction_order.head)
  66. self.eviction_order.append(node)
  67. self.cache[key] = node
  68.  
  69. print(self.cache)
  70.  
  71. if __name__ == '__main__':
  72. cache = LRUCache()
  73. cache.set('a', 1)
  74. cache.set('b', 2)
  75. cache.set('c', 3)
  76. cache.get('a')
  77. cache.set('d', 4)
Add Comment
Please, Sign In to add comment