zoukankan      html  css  js  c++  java
  • LRU

    LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。

    struct node
    {
        node(int _k = 0, int _v = 0, int _cnt=0) :k(_k), v(_v),cnt(_cnt) {}
        int k, v, cnt;
    };
    list<node> myList;
    unordered_map<int, list<node>::iterator> myMap;
    
    void LRUset(int key, int val, int k)
    {
        auto findit = myMap.find(key);
        
        //1.原来的缓存没有,新添加数据
        if (findit == myMap.end())
        {
            //缓存超过限制,删除最少使用的元素
            if (myList.size() < k)
            {
                myMap.erase(myList.rbegin()->k);
                myList.pop_back();
            }
            myList.emplace_front(node(key, val));
            myMap[key] = myList.begin();
        }
        //2.原缓存中存在,把旧数据删除再添加数据
        else
        {
            myList.erase(findit->second);
            myList.emplace_front(node(key, val));
            myMap[key] = myList.begin();
        }
    }
    
    int LRUget(int key)
    {
        auto findit = myMap.find(key);
        if (findit == myMap.end())
        {
            return -1;
        }
        else
        {
            //调整使用频率
            int val = findit->second->v;
            myList.erase(findit->second);
            myList.emplace_front(node(key, val));
            myMap[key] = myList.begin();
            return findit->second->v;
        }
    }
    
    vector<int> LRU(vector<vector<int> >& operators, int k)
    {
        vector<int> res;
        for (auto& it : operators)
        {
            if (it[0] == 1)
            {
                LRUset(it[1], it[2], k);
            }
            else
            {
                res.push_back(LRUget(it[1]));
            }
        }
        return res;
    }

  • 相关阅读:
    java内部类
    接口与继承
    数据结构
    数据I/O流
    课程总结
    第六次实训作业异常处理
    常用类的课后作业
    窗口实训1
    实训作业4
    实训作业3
  • 原文地址:https://www.cnblogs.com/jiguang321/p/14767602.html
Copyright © 2011-2022 走看看