File tree Expand file tree Collapse file tree 1 file changed +75
-0
lines changed
Sprint-2/implement_lru_cache Expand file tree Collapse file tree 1 file changed +75
-0
lines changed Original file line number Diff line number Diff line change 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+ class LruCache :
9+ def __init__ (self , limit : int ):
10+ if limit <= 0 :
11+ raise ValueError ("Cache limit must be greater than zero" )
12+
13+ self .limit = limit
14+ self .cache = {}
15+ self .head = None
16+ self .tail = None
17+ self .size = 0
18+
19+
20+ #to remove a node frpm linkedlist
21+ def _remove_node (self , node : Node ):
22+ if node .prev :
23+ node .prev .next = node .next
24+ else :
25+ self .head = node .next
26+
27+ if node .next :
28+ node .next .prev = node .prev
29+ else :
30+ self .tail = node .prev
31+
32+ node .prev = node .next = None
33+
34+
35+ #Add a node to the head of the linked list
36+ def _add_to_head (self , node : Node ):
37+ node .next = self .head
38+ node .prev = None
39+
40+ if self .head :
41+ self .head .prev = node
42+ self .head = node
43+
44+ if not self .tail :
45+ self .tail = node
46+
47+
48+ def get (self , key ):
49+ if key not in self .cache :
50+ return None
51+ node = self .cache [key ]
52+ # Move node to head (most recently used)
53+ self ._remove_node (node )
54+ self ._add_to_head (node )
55+ return node .value
56+
57+
58+ def set (self , key , value ):
59+ if key in self .cache :
60+ node = self .cache [key ]
61+ node .value = value
62+ self ._remove_node (node )
63+ self ._add_to_head (node )
64+ else :
65+ node = Node (key , value )
66+ self .cache [key ] = node
67+ self ._add_to_head (node )
68+ self .size += 1
69+
70+ if self .size > self .limit :
71+ # Evict LRU (tail node)
72+ lru = self .tail
73+ self ._remove_node (lru )
74+ del self .cache [lru .key ]
75+ self .size -= 1
You can’t perform that action at this time.
0 commit comments