upd
This commit is contained in:
60
algorithms/labs/lab8/code/hash/1.py
Normal file
60
algorithms/labs/lab8/code/hash/1.py
Normal file
@@ -0,0 +1,60 @@
|
||||
class Node:
|
||||
def __init__(self, key, val):
|
||||
self.key = key
|
||||
self.val = val
|
||||
self.prev = None
|
||||
self.next = None
|
||||
|
||||
|
||||
class LRUCache:
|
||||
def __init__(self, capacity: int):
|
||||
self.cap = capacity
|
||||
self.cache = {}
|
||||
self.left = Node(0, 0)
|
||||
self.right = Node(0, 0)
|
||||
self.left.next = self.right
|
||||
self.right.prev = self.left
|
||||
|
||||
def remove(self, node):
|
||||
p, n = node.prev, node.next
|
||||
p.next = n
|
||||
n.prev = p
|
||||
|
||||
def insert(self, node):
|
||||
p, n = self.right.prev, self.right
|
||||
p.next = node
|
||||
node.prev = p
|
||||
node.next = n
|
||||
n.prev = node
|
||||
|
||||
def get(self, key: int) -> int:
|
||||
if key not in self.cache:
|
||||
return -1
|
||||
node = self.cache[key]
|
||||
self.remove(node)
|
||||
self.insert(node)
|
||||
return node.val
|
||||
|
||||
def put(self, key: int, value: int) -> None:
|
||||
if key in self.cache:
|
||||
self.remove(self.cache[key])
|
||||
node = Node(key, value)
|
||||
self.cache[key] = node
|
||||
self.insert(node)
|
||||
if len(self.cache) > self.cap:
|
||||
lru = self.left.next
|
||||
self.remove(lru)
|
||||
del self.cache[lru.key]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
lru = LRUCache(2)
|
||||
lru.put(1, 1)
|
||||
lru.put(2, 2)
|
||||
print(lru.get(1))
|
||||
lru.put(3, 3)
|
||||
print(lru.get(2))
|
||||
lru.put(4, 4)
|
||||
print(lru.get(1))
|
||||
print(lru.get(3))
|
||||
print(lru.get(4))
|
||||
Reference in New Issue
Block a user