Skip to content

Commit 67c9cde

Browse files
committed
Implement LRU Cache functionality.
1 parent e718fb4 commit 67c9cde

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
'''
2+
if an item needs to be evicted, the item which was least recently used will be evicted.
3+
Both setting or getting a value counts as a use.
4+
It should support the following operations. Each operation should have a O(1) worst-case time complexity.
5+
* `LruCache(limit)` should construct an LRU cache which never stores more than `limit` entries.
6+
* `set(key, value)` should associate `value` with the passed `key`.
7+
* `get(key)` should look-up the value previously associated with `key`.
8+
'''
9+
10+
class Node:
11+
def __init__(self, key, value):
12+
self.key = key # store the key
13+
self.value = value # store the value
14+
self.prev = None # previous node in list
15+
self.next = None # next node in list
16+
17+
18+
class LruCache:
19+
def __init__(self, limit):
20+
21+
self.limit = limit
22+
self.data = {}
23+
self.first = None
24+
self.last = None
25+
26+
def set(self, key, value):
27+
28+
if key in self.data:
29+
node = self.data[key]
30+
node.value = value
31+
32+
# when node is used, is move to front
33+
if node != self.first:
34+
35+
if node.prev:
36+
node.prev.next = node.next
37+
if node.next:
38+
node.next.prev = node.prev
39+
40+
if node == self.last:
41+
self.last = node.prev
42+
43+
node.prev = None
44+
node.next = self.first
45+
self.first.prev = node
46+
self.first = node
47+
48+
return
49+
50+
# create new node when key doesn't exit
51+
node = Node(key, value)
52+
self.data[key] = node
53+
54+
node.next = self.first
55+
if self.first:
56+
self.first.prev = node
57+
self.first = node
58+
59+
if self.last is None:
60+
self.last = node
61+
62+
# remove last when size is bigger than limit
63+
if len(self.data) > self.limit:
64+
old = self.last
65+
66+
del self.data[old.key]
67+
68+
self.last = old.prev
69+
if self.last:
70+
self.last.next = None
71+
72+
def get(self, key):
73+
74+
if key not in self.data:
75+
return None
76+
77+
node = self.data[key]
78+
79+
# moving node to front because was used
80+
if node != self.first:
81+
82+
if node.prev:
83+
node.prev.next = node.next
84+
if node.next:
85+
node.next.prev = node.prev
86+
87+
if node == self.last:
88+
self.last = node.prev
89+
90+
node.prev = None
91+
node.next = self.first
92+
self.first.prev = node
93+
self.first = node
94+
95+
return node.value

0 commit comments

Comments
 (0)