Leetcode LFU Cache快取結構設計

2021-10-23 22:41:12 字數 2329 閱讀 9733

採取儲存方式為

乙個快取結構需要實現如下功能。

但是快取結構中最多放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 的資料上。既然大部分的業務訪問集中在一小部分資料上,那麼就可以把這一小部分資料快取在記憶體中,可以減少資料庫的訪問壓力,提高整個 的資料訪問速度,改善資料的寫入效能。在整個 應用中,快取幾乎無處不在,既存在於瀏覽器,也存在於應...