Skip to content

Commit 4933bed

Browse files
committed
LRU Cache
1 parent 25dae83 commit 4933bed

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed

Linked-list/LRUCache.cpp

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <unordered_map>
4+
5+
using namespace std;
6+
7+
class LRUCache
8+
{
9+
public:
10+
class Node // structure of doubly linked-list
11+
{
12+
public:
13+
int key, val;
14+
Node *prev, *next;
15+
16+
Node(int k, int v) // node initialiser
17+
{
18+
key = k;
19+
val = v;
20+
prev = next = nullptr;
21+
}
22+
};
23+
24+
// dummy head and tail
25+
Node *head = new Node(-1, -1);
26+
Node *tail = new Node(-1, -1);
27+
28+
unordered_map<int, Node *> m;
29+
int limit; // limit or capacity of cache
30+
31+
LRUCache(int capacity)
32+
{
33+
limit = capacity;
34+
head->next = tail;
35+
tail->prev = head;
36+
}
37+
38+
void addNode(Node *newNode) // to add node
39+
{
40+
Node *temp = head->next;
41+
42+
head->next = newNode;
43+
newNode->prev = head;
44+
newNode->next = temp;
45+
temp->prev = newNode;
46+
}
47+
48+
void delNode(Node *oldNode) // to delete node
49+
{
50+
Node *prevNode = oldNode->prev;
51+
Node *nextNode = oldNode->next;
52+
53+
prevNode->next = nextNode;
54+
nextNode->prev = prevNode;
55+
}
56+
57+
int get(int key)
58+
{
59+
if (m.find(key) == m.end()) // if key is not present
60+
{
61+
return -1;
62+
}
63+
64+
Node *ansNode = m[key];
65+
int ans = ansNode->val;
66+
m.erase(key);
67+
68+
delNode(ansNode);
69+
addNode(ansNode);
70+
m[key] = ansNode;
71+
72+
return ans;
73+
}
74+
75+
void put(int key, int value)
76+
{
77+
if (m.find(key) != m.end())
78+
{
79+
Node *existingNode = m[key];
80+
delNode(existingNode);
81+
m.erase(key);
82+
}
83+
84+
if (m.size() == limit)
85+
{
86+
m.erase(tail->prev->key);
87+
delNode(tail->prev);
88+
}
89+
90+
Node *newNode = new Node(key, value);
91+
addNode(newNode);
92+
m[key] = newNode;
93+
}
94+
};
95+
96+
int main()
97+
{
98+
LRUCache cache(2);
99+
100+
cache.put(1, 1);
101+
cache.put(2, 2);
102+
cout << cache.get(1) << endl; // returns 1
103+
104+
cache.put(3, 3); // evicts key 2
105+
cout << cache.get(2) << endl; // returns -1 (not found)
106+
107+
cache.put(4, 4); // evicts key 1
108+
cout << cache.get(1) << endl; // returns -1 (not found)
109+
cout << cache.get(3) << endl; // returns 3
110+
cout << cache.get(4) << endl; // returns 4
111+
112+
return 0;
113+
}

Linked-list/LRUCache.exe

133 KB
Binary file not shown.

0 commit comments

Comments
 (0)