Consolexin's blog Consolexin's blog
首页
  • 算法基础

    • 图论
    • 字符串
    • 动态规划
    • 二分
    • 滑动窗口
    • 排序
  • Project

    • CppServer
  • 相关书籍

    • 现代C++编程
  • 书籍

    • SQL必知必会
    • MySQL必知必会
分类
标签
归档
GitHub (opens new window)

Consolexinhun

小学生
首页
  • 算法基础

    • 图论
    • 字符串
    • 动态规划
    • 二分
    • 滑动窗口
    • 排序
  • Project

    • CppServer
  • 相关书籍

    • 现代C++编程
  • 书籍

    • SQL必知必会
    • MySQL必知必会
分类
标签
归档
GitHub (opens new window)
  • LFU
    • 随笔
    consolexinhun
    2021-12-20
    目录

    LFU

    内存管理之页面置换算法

    # LFU

    least frequently used

    笔记

    当页面的缓存满了时,选择访问频次最低的页面替换掉

     #include<bits/stdc++.h>
    
    using namespace std;
    
    class LFUCache {
        private:
            int cap; // 容量
            int min_freq; // 最小频率
            unordered_map<int, pair<int, int>> key_val_freq; // 键-频率映射
            unordered_map<int, list<int>> freq_key_list; // 频率-键链表映射
            unordered_map<int, list<int>::iterator> key_iter; // 链表迭代器映射
    
        public:
            LFUCache(int capacity): cap(capacity) {
                min_freq = 0;
            }
    
            int get(int key) {
                printf("the key %d, value = ", key);
                if(key_val_freq.find(key) == key_val_freq.end()) {
                    return -1;
                }
                int value = key_val_freq[key].first;
                int freq = key_val_freq[key].second;
    
                // 这个键对应的频率需要加一
                key_val_freq.erase(key);
                key_val_freq[key] = {value, freq+1};
    
                // 该频率需要移除这个key,频率加一需要添加这个key
                list<int>::iterator it = key_iter[key];
                freq_key_list[freq].erase(it);
    
                freq_key_list[freq+1].push_back(key);
                key_iter[key] = --freq_key_list[freq+1].end();
    
                // 更新最小频率,如果最小频率中没有元素了,就是刚刚更新的恰好是频率最小的元素,并且只有一个
                if(freq_key_list[min_freq].size() == 0) {
                    min_freq++; // 
                }
                return value;
            }
    
            void put(int key, int value) {
                if(cap <= 0) {
                    return ;
                }
                printf("put key=%d value=%d\n", key, value);
                if(get(key) != -1) {
                    key_val_freq[key].first = value;
                    return ;
                }
    
                if(key_val_freq.size() >= cap) { // 删除最不常用的
                    int remove_key = freq_key_list[min_freq].front();
                    key_val_freq.erase(remove_key);
                    key_iter.erase(remove_key);
                    freq_key_list[min_freq].pop_front();
                }
    
                key_val_freq[key] = {value, 1};
                freq_key_list[1].push_back(key);
                key_iter[key] = --freq_key_list[1].end();
    
                min_freq = 1;
            }
    };
    
    /**
     * 
     * */
    
    int main() {
        LFUCache *lfu = new LFUCache(2);
        lfu->put(2, 1);
        lfu->put(1, 1);
        lfu->put(2, 3);
        lfu->put(4, 1);
        cout<<lfu->get(1)<<endl;
        cout<<lfu->get(2)<<endl;
    
        return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83

    # LRU

    least recently used

    笔记

    当页面的缓存满了时,选择最久没有访问的页面替换掉

    
    
    1
    编辑 (opens new window)
    上次更新: 2025/05/21, 06:42:57
    最近更新
    01
    6-其他操作
    05-20
    02
    4-联结
    05-20
    03
    7-管理
    05-20
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 Consolexinhun | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×