16.25. LRU cache

This commit is contained in:
anebz 2019-09-19 09:31:26 +02:00
parent 6280172289
commit ee18a2cbef
1 changed files with 58 additions and 0 deletions

View File

@ -0,0 +1,58 @@
# Least Recently Used cache
> Design and build a LRU cache, which evicts the least recently used item. The cache should map from keys to values (allowing to insert and retrieve a value associated with a particular key), and be initialized with a max size. When it is full, it should evict the LRU item.
## First idea
Create linked list with max size, add in forward order. When a value is to be retrieved, visit the node and put it in the back. Keep a counter for number of items added, when it surpasses `max_len`, drop the head.
```java
class Node {
Node next = null;
int key;
int value;
int max_size;
public Node(int k, int v, int max_size){
this.key = k;
this.value = v;
this.max_size = max_size;
}
void appendToTail(int k, int v){
Node end = new Node(k, v);
Node head_tmp = this;
Node n = this;
int i = 0;
while (n.next != null){
// if max value is achieved, delete head node (the one accessed the last)
if(i >= head_tmp.max_size){
head_tmp = head_tmp.next;
i--;
}
n = n.next;
i++;
}
n.next = end;
}
int retrieve_value(int k){
while (n.next != null){
if(n.key == k){
return n.value;
}
n = n.next;
}
return -1
}
}
```
## Hints
Both a hash table and a doubly linked list would be useful, combine the two.
## Solution
A singly linked list is fast for eviction but slow for retrieval of keys. Make a doubly linked list, where it's easy to remove the middle element. The hash table maps to each linked list node rather than the value.