Skip to content

Commit 6ed7bbb

Browse files
authored
Create lru_cache.py
1 parent 9a8dbe2 commit 6ed7bbb

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

Diff for: lru_cache.py

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from dataclasses import dataclass
2+
3+
@dataclass
4+
class ListNode:
5+
key: any
6+
val: any
7+
prev: 'ListNode'
8+
next: 'ListNode'
9+
10+
class LinkedList:
11+
def __init__(self):
12+
self.head = ListNode(None, None, None, None)
13+
self.head.prev = self.head.next = self.head # null.next should be the most recent
14+
15+
def insert(self, node):
16+
next_node = self.head.next
17+
self.head.next, node.next = node, next_node
18+
node.prev, next_node.prev = self.head, node
19+
20+
def extract(self, node):
21+
# print(node.val)
22+
assert node != self.head
23+
prev, next = node.prev, node.next
24+
prev.next, next.prev = next, prev
25+
node.prev = node.next = None
26+
return node
27+
28+
class LRUCache:
29+
def __init__(self, capacity: int):
30+
self.capacity = capacity
31+
self.cnt = 0
32+
self.nodemap = {}
33+
self.linkedlist = LinkedList()
34+
35+
def get(self, key: int) -> int:
36+
if key in self.nodemap:
37+
node = self.nodemap.get(key)
38+
self.linkedlist.extract(node)
39+
self.linkedlist.insert(node)
40+
return node.val
41+
else:
42+
return -1
43+
44+
def put(self, key: int, value: int) -> None:
45+
if key in self.nodemap:
46+
node = self.nodemap.get(key)
47+
self.linkedlist.extract(node)
48+
self.linkedlist.insert(node)
49+
node.val = value
50+
else:
51+
if self.cnt == self.capacity:
52+
lru_node = self.linkedlist.head.prev
53+
self.linkedlist.extract(lru_node)
54+
del self.nodemap[lru_node.key]
55+
self.cnt -= 1
56+
node = ListNode(key, value, None, None)
57+
self.nodemap[key] = node
58+
self.linkedlist.insert(node)
59+
self.cnt += 1

0 commit comments

Comments
 (0)