Skip to content

Commit 08e1383

Browse files
committed
This is the implementation of the lru cache
1 parent 134e683 commit 08e1383

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
class Node:
2+
def __init__(self, key, value):
3+
self.key = key
4+
self.value = value
5+
self.prev = None
6+
self.next = None
7+
8+
9+
class LruCache:
10+
def __init__(self, limit):
11+
if limit <= 0:
12+
raise ValueError("Capacity must be greater than 0")
13+
self.capacity = limit
14+
self.cache = {}
15+
16+
self.head = Node(None, None)
17+
self.tail = Node(None, None)
18+
19+
self.head.next = self.tail
20+
self.tail.prev = self.head
21+
22+
def _remove(self, node):
23+
prev_node = node.prev
24+
next_node = node.next
25+
prev_node.next = next_node
26+
next_node.prev = prev_node
27+
28+
def _add_to_front(self, node):
29+
node.prev = self.head
30+
node.next = self.head.next
31+
self.head.next.prev = node
32+
self.head.next = node
33+
34+
def get(self, key):
35+
if key not in self.cache:
36+
return None
37+
38+
node = self.cache[key]
39+
self._remove(node)
40+
self._add_to_front(node)
41+
return node.value
42+
43+
def set(self, key, value):
44+
if key in self.cache:
45+
node = self.cache[key]
46+
node.value = value
47+
self._remove(node)
48+
self._add_to_front(node)
49+
else:
50+
new_node = Node(key, value)
51+
self.cache[key] = new_node
52+
self._add_to_front(new_node)
53+
54+
if len(self.cache) > self.capacity:
55+
lru = self.tail.prev
56+
self._remove(lru)
57+
del self.cache[lru.key]

0 commit comments

Comments
 (0)