Skip to content

Commit 88a5d26

Browse files
Implement LRU cache with O(1) operations
1 parent de683df commit 88a5d26

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
class Node:
2+
def __init__(self, key, value):
3+
self.key = key
4+
self.value = value
5+
self.next = None
6+
self.previous = None
7+
8+
9+
class LruCache:
10+
def __init__(self, limit):
11+
if limit <= 0:
12+
raise ValueError("Cache limit must be greater than 0")
13+
14+
self.limit = limit
15+
self.cache = {}
16+
self.head = None
17+
self.tail = None
18+
19+
def get(self, key):
20+
if key not in self.cache:
21+
return None
22+
23+
node = self.cache[key]
24+
25+
self._move_to_head(node)
26+
27+
return node.value
28+
29+
def set(self, key, value):
30+
if key in self.cache:
31+
node = self.cache[key]
32+
node.value = value
33+
self._move_to_head(node)
34+
else:
35+
if len(self.cache) >= self.limit:
36+
self._evict_tail()
37+
38+
new_node = Node(key, value)
39+
self.cache[key] = new_node
40+
self._add_to_head(new_node)
41+
42+
def _move_to_head(self, node):
43+
if node == self.head:
44+
return
45+
46+
self._remove_node(node)
47+
48+
self._add_to_head(node)
49+
50+
def _remove_node(self, node):
51+
if node == self.head == self.tail:
52+
self.head = None
53+
self.tail = None
54+
elif node == self.head:
55+
self.head = node.next
56+
self.head.previous = None
57+
elif node == self.tail:
58+
self.tail = node.previous
59+
self.tail.next = None
60+
else:
61+
node.previous.next = node.next
62+
node.next.previous = node.previous
63+
64+
node.next = None
65+
node.previous = None
66+
67+
def _add_to_head(self, node):
68+
node.next = None
69+
node.previous = None
70+
71+
if self.head is None:
72+
self.head = node
73+
self.tail = node
74+
else:
75+
node.next = self.head
76+
self.head.previous = node
77+
self.head = node
78+
79+
def _evict_tail(self):
80+
if self.tail is None:
81+
return
82+
83+
del self.cache[self.tail.key]
84+
85+
if self.head == self.tail:
86+
self.head = None
87+
self.tail = None
88+
else:
89+
self.tail = self.tail.previous
90+
self.tail.next = None

0 commit comments

Comments
 (0)