Skip to content

Commit c751f6c

Browse files
author
qinxin
committed
LFU
Change-Id: Ib0701dfef3f690e64ca09f2981c399fb9013bea8
1 parent 3bcd8eb commit c751f6c

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

Algorithm/LFU.cc

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#include <iostream>
2+
#include <list>
3+
#include <string>
4+
#include <unordered_map>
5+
#include <vector>
6+
using namespace std;
7+
8+
struct node {
9+
string key;
10+
int fre;
11+
int value;
12+
};
13+
14+
class LFU {
15+
public:
16+
LFU(int size) {
17+
cap = size;
18+
minfre = 100;
19+
};
20+
node* Get(string key) {
21+
if (vnode.find(key) == vnode.end()) {
22+
return nullptr;
23+
}
24+
auto i = vnode[key];
25+
auto fre = (*i)->fre;
26+
auto value = (*i)->value;
27+
fnode[fre].erase(i);
28+
delete *i;
29+
if (fnode[fre].size() == 0 && minfre == fre) {
30+
minfre++;
31+
}
32+
fre++;
33+
node* newnode = new node{key, fre, value};
34+
fnode[fre].push_front(newnode);
35+
return newnode;
36+
};
37+
node* Set(string key, int value) {
38+
if (vnode.size() < cap) {
39+
node* newnode = new node{key, 1, value};
40+
fnode[1].push_front(newnode);
41+
vnode.insert({key, list<node*>::iterator(fnode[1].begin())});
42+
if (minfre > 1) {
43+
minfre = 1;
44+
}
45+
return nullptr;
46+
}
47+
auto i = fnode[minfre].rbegin();
48+
vnode.erase((*i)->key);
49+
fnode[minfre].pop_back();
50+
node* newnode = new node{key, 1, value};
51+
fnode[1].push_front(newnode);
52+
vnode.insert({key, list<node*>::iterator(fnode[1].begin())});
53+
if (minfre > 1) {
54+
minfre = 1;
55+
}
56+
return *i;
57+
};
58+
59+
void Print() {
60+
cout << "print begin" << endl;
61+
for (auto i : fnode) {
62+
cout << "fre:" << i.first << endl;
63+
for (auto j : i.second) {
64+
cout << j->value << " ";
65+
}
66+
cout << endl;
67+
}
68+
cout << endl;
69+
}
70+
71+
private:
72+
unordered_map<string, list<node*>::iterator> vnode;
73+
unordered_map<int, list<node*>> fnode;
74+
int cap;
75+
int minfre;
76+
};
77+
78+
int main() {
79+
LFU foo(3);
80+
foo.Set("hello", 10);
81+
foo.Set("world", 2);
82+
foo.Set("ni", 1);
83+
foo.Set("hao", 33);
84+
foo.Get("ni");
85+
foo.Get("ni");
86+
foo.Set("wo", 123);
87+
foo.Get("wo");
88+
foo.Get("wo");
89+
foo.Get("hao");
90+
foo.Get("hao");
91+
foo.Set("shi", 111);
92+
foo.Print();
93+
};

0 commit comments

Comments
 (0)