Skip to content

Commit a38edee

Browse files
committed
added solution to implement LRU cache
1 parent e427c63 commit a38edee

File tree

3 files changed

+139
-2
lines changed

3 files changed

+139
-2
lines changed

src/main/java/com/eprogrammerz/examples/algorithm/crackingCoding/PowerSet.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ public static Set<Set<Integer>> getSubsets(List<Integer> integers, int index) {
3636
Integer item = integers.get(index);
3737
Set<Set<Integer>> moreSubset = new LinkedHashSet<>();
3838
for (Set<Integer> subset: powerSet) {
39-
Set<Integer> newSubset = new LinkedHashSet<>();
40-
newSubset.addAll(subset);
39+
Set<Integer> newSubset = new LinkedHashSet<>(subset);
4140
newSubset.add(item);
4241
moreSubset.add(newSubset);
4342
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package com.eprogrammerz.examples.ds.cache;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.PriorityQueue;
6+
7+
/**
8+
* Design LRU cache with fix size i.e. if cache reaches max size, then least recently has to be removed!
9+
*
10+
* 2 -> (2,yogen,next,prev)
11+
* 3 -> (3,rai,next,prev)
12+
* 4 -> (4,nepal,next,prev)
13+
* 1 -> (1,intro)
14+
*
15+
*
16+
* head will track to MRU and tail will track to LRU
17+
*
18+
* 2,yogen -> 3,rai -> 4,nepal
19+
* cache.get(3)
20+
* 3,rai -> 2,yogen -> 4,nepal
21+
* cache.put(1)
22+
* 1,intro -> 2,yogen -> 4,nepal
23+
*
24+
*/
25+
public class LRUCache<K, V> {
26+
27+
private class Node<K,V> {
28+
K key;
29+
V value;
30+
31+
Node<K,V> next;
32+
Node<K,V> prev;
33+
34+
Node(K key, V value) {
35+
this.key = key;
36+
this.value = value;
37+
}
38+
39+
@Override
40+
public String toString() {
41+
return "(" + key + ", " + value + ")";
42+
}
43+
}
44+
45+
private int size;
46+
47+
private Map<K,Node<K,V>> map;
48+
49+
private Node<K, V> head;
50+
private Node<K, V> tail;
51+
52+
public LRUCache(int initialCapacity) {
53+
this.size = initialCapacity;
54+
this.map = new HashMap<>(initialCapacity);
55+
}
56+
57+
public void put(K key, V value) {
58+
Node<K,V> node = new Node<>(key, value);
59+
if (size == map.size()) {
60+
// remove tail
61+
map.remove(tail.key);
62+
removeNode(tail);
63+
64+
}
65+
insertNodeAtFirst(node);
66+
67+
map.put(key, node);
68+
}
69+
70+
private void insertNodeAtFirst(Node<K, V> node) {
71+
if (head == null) {
72+
head = node;
73+
tail = node;
74+
} else {
75+
node.next = head;
76+
head.prev = node;
77+
head = node;
78+
}
79+
}
80+
81+
public V get(K key) {
82+
Node<K,V> node = map.get(key);
83+
84+
if (node == null) return null;
85+
86+
if (node != head) {
87+
// remove node from its current spot
88+
removeNode(node);
89+
90+
// add to the from of the list
91+
insertNodeAtFirst(node);
92+
}
93+
94+
return node.value;
95+
}
96+
97+
private void removeNode(Node<K, V> node) {
98+
if (node == null) return;
99+
100+
if (node.prev != null) {
101+
node.prev.next = node.next;
102+
}
103+
104+
if (node.next != null) {
105+
node.next.prev = node.prev;
106+
}
107+
if (tail == node) tail = node.prev;
108+
if (head == node) head = node.next;
109+
}
110+
111+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.eprogrammerz.examples.ds.cache;
2+
3+
import org.junit.Test;
4+
5+
import static org.junit.Assert.assertEquals;
6+
import static org.junit.Assert.assertNull;
7+
8+
public class LRUCacheTest {
9+
@Test
10+
public void testLRUCache() {
11+
LRUCache<String, String> cache = new LRUCache<>(3);
12+
cache.put("Yogen", "rai1");
13+
cache.put("Pratima", "rai2");
14+
cache.put("Yogesh", "rai3");
15+
16+
assertEquals("rai1", (cache.get("Yogen"))); // ["Yogesh", "Pratima", "Yogen"]
17+
assertEquals("rai2", cache.get("Pratima")); // ["Pratima", "Yogesh", "Yogen"]
18+
19+
cache.put("Srijana", "khaling");
20+
cache.put("another", "another");
21+
assertNull(cache.get("Yogen"));
22+
assertNull(cache.get("Yogesh"));
23+
assertEquals("rai2", cache.get("Pratima"));
24+
assertEquals("khaling", cache.get("Srijana"));
25+
assertEquals("another", cache.get("another")); // ["another", "srijana", "Pratima"]
26+
}
27+
}

0 commit comments

Comments
 (0)