Skip to content

Commit fbd0d6c

Browse files
committed
New changes for SRP
1 parent 08e1383 commit fbd0d6c

1 file changed

Lines changed: 37 additions & 21 deletions

File tree

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,73 @@
11
class Node:
2+
"""Represents a single node in the doubly linked list."""
23
def __init__(self, key, value):
34
self.key = key
45
self.value = value
56
self.prev = None
67
self.next = None
78

89

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-
10+
class DoublyLinkedList:
11+
"""Manages a doubly linked list with sentinel head and tail nodes."""
12+
13+
def __init__(self):
1614
self.head = Node(None, None)
1715
self.tail = Node(None, None)
18-
1916
self.head.next = self.tail
2017
self.tail.prev = self.head
2118

22-
def _remove(self, node):
19+
def add_to_front(self, node):
20+
"""Add a node to the front of the list (right after head)."""
21+
node.prev = self.head
22+
node.next = self.head.next
23+
self.head.next.prev = node
24+
self.head.next = node
25+
26+
def remove(self, node):
27+
"""Remove a node from the list."""
2328
prev_node = node.prev
2429
next_node = node.next
2530
prev_node.next = next_node
2631
next_node.prev = prev_node
2732

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+
def get_least_recent(self):
34+
"""Get the least recently used node (just before tail)."""
35+
return self.tail.prev
36+
37+
38+
class LruCache:
39+
"""LRU Cache implementation using a doubly linked list to track usage order."""
40+
41+
def __init__(self, limit):
42+
if limit <= 0:
43+
raise ValueError("Capacity must be greater than 0")
44+
self.capacity = limit
45+
self.cache = {}
46+
self.linked_list = DoublyLinkedList()
3347

3448
def get(self, key):
49+
"""Get a value from the cache and mark it as recently used."""
3550
if key not in self.cache:
3651
return None
3752

3853
node = self.cache[key]
39-
self._remove(node)
40-
self._add_to_front(node)
54+
self.linked_list.remove(node)
55+
self.linked_list.add_to_front(node)
4156
return node.value
4257

4358
def set(self, key, value):
59+
"""Set a value in the cache, evicting the LRU item if at capacity."""
4460
if key in self.cache:
4561
node = self.cache[key]
4662
node.value = value
47-
self._remove(node)
48-
self._add_to_front(node)
63+
self.linked_list.remove(node)
64+
self.linked_list.add_to_front(node)
4965
else:
5066
new_node = Node(key, value)
5167
self.cache[key] = new_node
52-
self._add_to_front(new_node)
68+
self.linked_list.add_to_front(new_node)
5369

5470
if len(self.cache) > self.capacity:
55-
lru = self.tail.prev
56-
self._remove(lru)
71+
lru = self.linked_list.get_least_recent()
72+
self.linked_list.remove(lru)
5773
del self.cache[lru.key]

0 commit comments

Comments
 (0)