-
缓存结构:
-
使用一个双向链表(
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;
}