Skip to content

Commit 0991ae0

Browse files
committed
implement LRU cache
1 parent e718fb4 commit 0991ae0

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
class Node:
2+
def __init__(self, key, value):
3+
self.key = key
4+
self.value = value
5+
self.previous = None
6+
self.next = None
7+
8+
9+
class LruCache:
10+
def __init__(self, limit):
11+
if limit <= 0:
12+
raise ValueError("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 _remove(self, node):
20+
if node.previous:
21+
node.previous.next = node.next
22+
else:
23+
self.head = node.next
24+
25+
if node.next:
26+
node.next.previous = node.previous
27+
else:
28+
self.tail = node.previous
29+
30+
node.previous = None
31+
node.next = None
32+
33+
def _add_to_head(self, node):
34+
node.next = self.head
35+
node.previous = None
36+
37+
if self.head:
38+
self.head.previous = node
39+
else:
40+
self.tail = node
41+
42+
self.head = node
43+
44+
def get(self, key):
45+
if key not in self.cache:
46+
return None
47+
48+
node = self.cache[key]
49+
self._remove(node)
50+
self._add_to_head(node)
51+
52+
return node.value
53+
54+
def set(self, key, value):
55+
if key in self.cache:
56+
node = self.cache[key]
57+
node.value = value
58+
self._remove(node)
59+
self._add_to_head(node)
60+
return
61+
62+
if len(self.cache) >= self.limit:
63+
lru = self.tail
64+
if lru:
65+
self._remove(lru)
66+
del self.cache[lru.key]
67+
68+
new_node = Node(key, value)
69+
self._add_to_head(new_node)
70+
self.cache[key] = new_node

0 commit comments

Comments
 (0)