採取儲存方式為
乙個快取結構需要實現如下功能。
但是快取結構中最多放k條記錄,如果新的第k+1條記錄要加入,就需要根據策略刪掉一條記錄,然後才能把新記錄加入。這個策略為:在快取結構的k條記錄中,哪乙個key從進入快取結構的時刻開始,被呼叫set或者get的次數最少,就刪掉這個key的記錄;
如果呼叫次數最少的key有多個,上次呼叫發生最早的key被刪除
這就是lfu快取替換演算法。實現這個結構,k作為引數給出
[要求]
set和get方法的時間複雜度為o(1)
若opt=1,接下來兩個整數x, y,表示set(x, y)
若opt=2,接下來乙個整數x,表示get(x),若x未出現過或已被移除,則返回-1
對於每個操作2,輸出乙個答案
示例1複製
[[1,1,1],[1,2,2],[1,3,2],[1,2,4],[1,3,5],[2,2],[1,4,4],[2,1]],3複製
[4,-1]
在執行"1 2 4"後,"1 1 1"被刪除。因此第二次詢問的答案為-1基本設計結構:
即 :
通過乙個min_num記錄當前最少set get操作次數
核心map 存放 key到對應(key,value,num)的對映 其中num表示其次數
由於相同的運算元目可能多個(key,value) 故採取拉鍊法處理map衝突 list鍊錶最後乙個表示當前最久的(key,value)
int capacity;//快取容量
int min_num;//最小的set get運算元
map::iterator> mp;//存放key對應的(key,value,num)所在的鍊錶位置
map> num_node;//存放num次運算元目對應的 (key,value,num)鍵值對
核心get方法:
關鍵點:
通過map找到對應的(key,value,num)
刪除拉鍊 對應節點
int get(int key)
//放入num+1 拉鍊處
num_node[num+1].push_front(node(key,value,num+1));
mp[key]=num_node[num+1].begin();
return value;
}
核心set方法:
void set(int key,int value)
}//新加入到拉鍊[1]位置
num_node[1].push_front(node(key,value,1));
mp[key]=num_node[1].begin();
min_num=1;//最少set get次數一定是1
}else //之前快取中存在 那麼更新key對應的num數量
//同時增加到 [num+1]拉鍊處 頭部
num_node[num+1].push_front(node(key,value,num+1));
mp[key]=num_node[num+1].begin();
}}
完整**:
struct node
};class lfu_cache
void set(int key,int value)
}//新加入到拉鍊[1]位置
num_node[1].push_front(node(key,value,1));
mp[key]=num_node[1].begin();
min_num=1;//最少set get次數一定是1
}else //之前快取中存在 那麼更新key對應的num數量
//同時增加到 [num+1]拉鍊處 頭部
num_node[num+1].push_front(node(key,value,num+1));
mp[key]=num_node[num+1].begin();}}
int get(int key)
//放入num+1 拉鍊處
num_node[num+1].push_front(node(key,value,num+1));
mp[key]=num_node[num+1].begin();
return value;
}};class solution
else if(operators[i].size()==2 && operators[i][0]==2)
}return res;
}};
快取架構設計
快取架構設計 需求分析 快取是一種提高系統讀效能的常見技術,對於讀多寫少的應用場景,我們經常使用快取來進行優化。例如對於使用者的餘額資訊表account uid,money 業務上的需求是 查詢使用者的餘額,select money from account where uid 佔99 的請求 更改...
快取架構設計
1 快取技術和框架的重要性 網際網路的一些高併發,高效能的專案和系統中,快取技術是起著功不可沒的作用。快取不僅僅是key value的簡單訪問,它在具體的業務場景中,還是很複雜的,需要很強的架構設計能力。我曾經就遇到過因為快取架構設計不到位,導致了系統崩潰的案例。2 快取的技術方案分類 1 是做實時...
架構設計 快取 快取的原理與應用
訪問特點和現實世界的財富分配一樣遵循二八定律 80 的業務訪問集中在20 的資料上。既然大部分的業務訪問集中在一小部分資料上,那麼就可以把這一小部分資料快取在記憶體中,可以減少資料庫的訪問壓力,提高整個 的資料訪問速度,改善資料的寫入效能。在整個 應用中,快取幾乎無處不在,既存在於瀏覽器,也存在於應...