About LFU cache and LRU cache
来源:互联网 发布:80端口被屏蔽 编辑:程序博客网 时间:2024/06/05 23:53
LRU Cache
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.
get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
To achieve the functions mentioned in LRU description, we would use a list to store pair(key, value), because we want these pairs arranged by time; using list enable us to alter the order of pairs in constant time.
class LRUCache{public: LRUCache(int capacity) { this->capacity = capacity; } int get(int key) { if(table.find(key) == table.end()) return -1; else{ timeList.splice(timeList.begin(), timeList, table.find(key)->second); return table.find(key)->second->second; } } void set(int key, int value) { if(table.find(key) != table.end()){ timeList.splice(timeList.begin(), timeList, table.find(key)->second); table.find(key)->second->second = value; return; } if(table.size() == capacity){ table.erase(timeList.back().first); timeList.pop_back(); } timeList.emplace_front(key, value); table[key] = timeList.begin(); }private: unordered_map<int, list<pair<int,int>>::iterator> table; size_t capacity; list<pair<int,int>> timeList;};
LFU Cache
Consider this:
At the beginning, I thought
class LFUCache {public: LFUCache(int capacity) { this->capacity = capacity; size = 0; } int get(int key) { if(pairIdx.find(key) == pairIdx.end()) return -1; else{ freqIdx[pairIdx[key].second].erase(listIdx[key]); pairIdx[key].second++; freqIdx[pairIdx[key].second].push_back(key); listIdx[key] = --freqIdx[pairIdx[key].second].end(); if(freqIdx[minFreq].size() == 0) minFreq = pairIdx[key].second; return pairIdx[key].first; } } void set(int key, int value) { // Set if(capacity <= 0) return; if(pairIdx.find(key) != pairIdx.end()){ pairIdx[key].first = value; // Change value // Change freq freqIdx[pairIdx[key].second].erase(listIdx[key]); pairIdx[key].second++; freqIdx[pairIdx[key].second].push_back(key); if(freqIdx[minFreq].size() == 0) minFreq = pairIdx[key].second; // Change pointer to key in list listIdx[key] = --freqIdx[pairIdx[key].second].end(); return; } // Delete if(size >= capacity){ pairIdx.erase(freqIdx[minFreq].front()); listIdx.erase(freqIdx[minFreq].front()); freqIdx[minFreq].pop_front(); size--; } // Insert minFreq = 1; pairIdx[key] = {value, 1}; freqIdx[1].push_back(key); listIdx[key] = --freqIdx[1].end(); size++; }private: unordered_map<int, pair<int, int>> pairIdx; unordered_map<int, list<int>::iterator> listIdx; unordered_map<int, list<int>> freqIdx; int capacity, minFreq, size;};
0 0
- About LFU cache and LRU cache
- leetcode 146. LRU Cache 460. LFU Cache
- 亲自操刀:cache页面置换算法LRU AND LFU
- LFU Cache
- LFU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- lru cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- HTTP-请求、响应、缓存
- 项目管理PV、EV、AC、BAC、EAC、ETC等计算
- Gson使用入门——初级篇
- Leetcode 60. Permutation Sequence (Medium) (cpp)
- GeoGebra入门之一分钟制作光的反射动态仿真模拟课件
- About LFU cache and LRU cache
- 一起talk C栗子吧(第一百九十一回:C语言实例--文件定位四 )
- openfire4.04编译后,浏览器中登录控制台部分乱码
- [Q学习]16 Qt状态机框架——共享状态迁移
- Hibernate基础:快速入门(1):概要及准备
- SSD训练与数据集方面的要点
- 用flask开发个人博客(7)—— flask中设置和获取cookie
- vmware workstation player默认自动安装
- php unset()详解