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