LRU CPP实现

  • 缓存结构:

    • 使用一个双向链表(std::list<int>)保存缓存中的页面编号,越靠前的是最近访问的,越靠后的是最久未访问的

    • 使用一个哈希表(std::unordered_map<int, list<int>::iterator>)保存每个页面编号在链表中的位置,实现 O(1) 时间复杂度的查找、插入和删除。

  • 操作定义:

    • 插入 A x:

      • 如果页面 x 已存在,移动到链表头部(刷新访问时间)。

      • 如果页面 x 不存在:

        • 插入链表头部。

        • 如果超出容量限制 N,移除链表尾部(最久未使用的页面)。

    • 查询 Q x:

      • 如果页面存在,移动到链表头部(刷新访问时间)。

      • 如果不存在,忽略。

    • 删除 D x:

      • 如果页面存在,从链表和哈希表中删除。

      • 如果不存在,忽略。

  • 最终输出:

    • 输出链表内容,即缓存中的页面编号,按照最近访问的顺序输出(前 -> 后)。

// 双向链表存储数据 hash存储node-> index

#include<bits/stdc++.h>

using namespace std;

int main(){
    int n,k;
    cin>>n>>k;
    list<int> cacheList;
    unordered_map<int,list<int>::iterator> int2ptr;
    for(int i=0;i<k;i++){
        char ch;int num;
        cin>>ch>>num;
        if(ch=='A'){
            //插入
            if(int2ptr.count(num)==0){
                cacheList.push_front(num);
                int2ptr[num]=cacheList.begin();
            }
            else{
                cacheList.erase(int2ptr[num]);// 删除旧的
                cacheList.push_front(num);
                int2ptr[num]=cacheList.begin();
            }
            if(cacheList.size()>n){
                int t = cacheList.back();
                cacheList.pop_back();//list
                int2ptr.erase(t);//map
            }
        }
        else if(ch=='Q'){
            if(int2ptr.count(num)!=0){
                cacheList.erase(int2ptr[num]);// 删除旧的
                cacheList.push_front(num);
                int2ptr[num]=cacheList.begin();
            }
        }
        else if(ch=='D'){
            if(int2ptr.count(num)!=0){
                cacheList.erase(int2ptr[num]);// 删除旧的
                int2ptr.erase(num);
            }
        }
    }

    // 输出
    for(auto&x:cacheList){
        cout<<x<<" ";
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值