- LRU 缓存
LRU 缓存
调了调哈希函数,表长,这下舒服了
#define N 20001
class LRUCache {
public:
const int inf=1e7;
int hs[N];
int va[N];
int list[N+10][2];
int start;
int end;
int len;
int sum;
int get_hash(int x){
int idx=x*7%N;
do{
if(hs[idx]==x) return idx;
if(hs[idx]==-1) return -1;
idx=(idx+1)%N;
}while(idx!=x*7%N);
return -1;
}
int init_hash(int x){
int idx=x*7%N;
do{
if(hs[idx]==-1||hs[idx]==inf) break;
idx=(idx+1)%N;
}while(idx!=x*7%N);
hs[idx]=x;
return idx;
}
int init_list(int x){
int idx=get_hash(x);
if(idx!=-1){
list[list[idx][0]][1]=list[idx][1];
list[list[idx][1]][0]=list[idx][0];
}
else{
if(sum==len) {
int idx=list[start][1];
list[start][1]=list[idx][1];
list[list[idx][1]][0]=start;
hs[idx]=inf;
}
else sum++;
idx=init_hash(x);
}
list[idx][1]=end;
list[idx][0]=list[end][0];
list[end][0]=idx;
list[list[idx][0]][1]=idx;
return idx;
}
LRUCache(int capacity) {
len=capacity;
sum=0;
start=N;
end=N+1;
for(int i=0;i<N;i++)
hs[i]=-1;
list[start][1]=end;
list[end][0]=start;
}
int get(int key) {
int idx=get_hash(key);
if(idx!=-1){
init_list(key);
return va[idx];
}
return -1;
}
void put(int key, int value) {
int idx=init_list(key);
va[idx]=value;
}
};