16.25. LRU cache
This commit is contained in:
parent
6280172289
commit
ee18a2cbef
|
|
@ -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.
|
||||||
Loading…
Reference in New Issue