File tree Expand file tree Collapse file tree
Sprint-2/implement_lru_cache Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ from typing import Optional
2+
3+ class _Node :
4+ def __init__ (self , key = None , value = None ):
5+ self .key = key
6+ self .value = value
7+ self .prev : Optional ["_Node" ] = None
8+ self .next : Optional ["_Node" ] = None
9+
10+ class LruCache :
11+ def __init__ (self , limit ):
12+ if limit <= 0 :
13+ raise ValueError ("limit must be positive" )
14+
15+ self .limit = limit
16+ self .cache = {}
17+
18+ self .head = _Node ()
19+ self .tail = _Node ()
20+ self .head .next = self .tail
21+ self .tail .prev = self .head
22+
23+ def remove (self , node ):
24+ node .prev .next = node .next
25+ node .next .prev = node .prev
26+
27+ def add_to_front (self , node ):
28+ next_node = self .head .next
29+ assert next_node is not None
30+
31+ node .next = next_node
32+ node .prev = self .head
33+ next_node .prev = node
34+ self .head .next = node
35+
36+ def get (self , key ):
37+ if key not in self .cache :
38+ return None
39+
40+ node = self .cache [key ]
41+ self .remove (node )
42+ self .add_to_front (node )
43+ return node .value
44+
45+ def set (self , key , value ):
46+ if key in self .cache :
47+ node = self .cache [key ]
48+ node .value = value
49+ self .remove (node )
50+ self .add_to_front (node )
51+ return
52+
53+ node = _Node (key , value )
54+ self .cache [key ] = node
55+ self .add_to_front (node )
56+
57+ if len (self .cache ) > self .limit :
58+ lru = self .tail .prev
59+ assert lru is not None
60+ self .remove (lru )
61+ del self .cache [lru .key ]
You can’t perform that action at this time.
0 commit comments