Skip to content

Commit 5d15575

Browse files
committed
Add 014
1 parent 78f4016 commit 5d15575

File tree

4 files changed

+129
-2
lines changed

4 files changed

+129
-2
lines changed

004二分查询.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def binary_search(a, x, start, end):
4646
a = [1, 2, 3, 5, 55, 66, 77, 88, 99, 100]
4747
x = 2
4848
49-
binary_search(a, x, 0, len(a)
49+
binary_search(a, x, 0, len(a))
5050
# Print 1
5151
```
5252

013Trie树.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,4 @@ print(tree.search("abcd"))
117117
# Print False
118118
```
119119

120-
这是本章内容,希望对你有所帮助。[进入下一章](./013Trie树.md)
120+
这是本章内容,希望对你有所帮助。[进入下一章](./014LRU缓存.md)

014LRU缓存.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
2+
# 实现LRUN缓存
3+
4+
## 什么是LRU缓存
5+
6+
LRU全称是Least Recently Used,也就是淘汰最晚使用的缓存技术,根据局部性原理,认为很久以前不用的数据最近也不会被使用。
7+
8+
我们可以用不同的数据结构如数组、链表来实现LRU缓存,
9+
10+
## 如何实现LRU缓存
11+
12+
要实现LRU,其实只需要实现set()和get()两个方法即可,并且保证数组容量超过时按照LRU的策略进行移除对象,这里有个trick就是get或update对象时先移除对象再加入到队列中。
13+
14+
Python的collections库中包含OrderedDict,可以更容易得实现LRU缓存,但为了避免高级特性我们还是使用array和dictionary来实现。
15+
16+
```
17+
class LRUCache(object):
18+
19+
def __init__(self, capacity):
20+
"""
21+
:type capacity: int
22+
"""
23+
24+
self.capacity = capacity
25+
# Example: ["k1", "k2"]
26+
self.keys = []
27+
# Example: {"k1": "v1"}, {"k2": "v2"}
28+
self.data = {}
29+
30+
31+
def get(self, key):
32+
"""
33+
:rtype: int
34+
"""
35+
36+
# If match, update the index and return the data
37+
if key in self.keys:
38+
self.keys.remove(key)
39+
self.keys.insert(0, key)
40+
return self.data[key]
41+
42+
# If no match, just return -1
43+
else:
44+
return -1
45+
46+
47+
def set(self, key, value):
48+
"""
49+
:type key: int
50+
:type value: int
51+
:rtype: nothing
52+
"""
53+
54+
# If there is the key
55+
if key in self.keys:
56+
self.data[key] = value
57+
self.keys.remove(key)
58+
self.keys.insert(0, key)
59+
60+
# If there is no key and there's no capacity
61+
elif len(self.keys) >= self.capacity:
62+
self.keys.pop()
63+
self.data[key] = value
64+
self.keys.insert(0, key)
65+
66+
# If there is no key and there is some capacity
67+
else:
68+
self.data[key] = value
69+
self.keys.insert(0, key)
70+
```

lru.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
2+
```
3+
class LRUCache(object):
4+
5+
def __init__(self, capacity):
6+
"""
7+
:type capacity: int
8+
"""
9+
10+
self.capacity = capacity
11+
# Example: [{"k1": "v1"}, {"k2": "v2"}]
12+
self.items = []
13+
14+
15+
def get(self, key):
16+
"""
17+
:rtype: int
18+
"""
19+
20+
for i, kv in enumerate(self.items):
21+
if kv.keys()[0] == key:
22+
del(self.items[i])
23+
self.items.insert(0, kv)
24+
return kv.values()[0]
25+
26+
# Return -1 if no match
27+
return -1
28+
29+
30+
def set(self, key, value):
31+
"""
32+
:type key: int
33+
:type value: int
34+
:rtype: nothing
35+
"""
36+
37+
if len(self.items) == 0:
38+
self.items.insert(0, {key: value})
39+
40+
for i, kv in enumerate(self.items):
41+
# If there is the key, just remove and insert in the head
42+
if kv.keys()[0] == key:
43+
del(self.items[i])
44+
self.items.insert(0, {key: value})
45+
# If there is no key and there's no capacity
46+
elif len(self.items) >= self.capacity:
47+
# Remove one
48+
self.items.pop()
49+
50+
# Insert one
51+
self.items.insert(0, {key: value})
52+
# If there is no key and there is some capacity
53+
else:
54+
# Insert one
55+
self.items.insert(0, {key: value})
56+
```
57+

0 commit comments

Comments
 (0)