Skip to content

Commit a2bf66d

Browse files
committed
lru cache
1 parent e718fb4 commit a2bf66d

1 file changed

Lines changed: 73 additions & 0 deletions

File tree

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
class LruCache:
2+
def __init__(self, limit):
3+
if limit <= 0:
4+
raise ValueError("limit must be greater than 0")
5+
self.limit = limit
6+
self.keys = {}
7+
self.linkedList = LinkedList()
8+
9+
def get(self, key):
10+
if key not in self.keys:
11+
return None
12+
else:
13+
self.linkedList.remove(self.keys[key])
14+
self.linkedList.push_head(self.keys[key])
15+
return self.keys[key].data
16+
17+
def set(self, key, data):
18+
if key not in self.keys:
19+
if len(self.keys) >= self.limit:
20+
node_to_delete = self.linkedList.pop_tail()
21+
del self.keys[node_to_delete.key]
22+
self.keys[key] = Node(key, data)
23+
self.linkedList.push_head(self.keys[key])
24+
25+
else:
26+
self.keys[key].data = data
27+
self.linkedList.push_head(self.keys[key])
28+
29+
class Node:
30+
def __init__(self, key, data):
31+
self.key = key
32+
self.data = data
33+
self.next = None
34+
self.previous = None
35+
36+
37+
class LinkedList:
38+
def __init__(self):
39+
self.head = None
40+
self.tail = None
41+
42+
def push_head(self, new_node):
43+
new_node.previous = None
44+
new_node.next = None
45+
if self.head is None:
46+
self.head = new_node
47+
self.tail = new_node
48+
else:
49+
new_node.next = self.head
50+
self.head.previous = new_node
51+
self.head = new_node
52+
return new_node
53+
54+
def remove(self, node):
55+
if node is None:
56+
return
57+
if node == self.head:
58+
self.head = node.next
59+
if node == self.tail:
60+
self.tail = node.previous
61+
if node.previous is not None:
62+
node.previous.next = node.next
63+
if node.next is not None:
64+
node.next.previous = node.previous
65+
node.next = None
66+
node.previous = None
67+
68+
def pop_tail(self):
69+
if self.tail is None:
70+
return None
71+
node_to_pop = self.tail
72+
self.remove(self.tail)
73+
return node_to_pop

0 commit comments

Comments
 (0)