C++实现LRU(最久未使用)缓存算法
2015-09-11 16:21
1076 查看
LRU缓存算法也叫LRU页面置换算法,是一种经典常用的页面置换算法,本文将用C++实现一个LRU算法。
LRU算法实现并不难,但是要高效地实现却是有难度的,要想高效实现其中的插入、删除、查找,第一想法就是红黑树,但是红黑树也是一种折中的办法。插入、删除效率最高当属链表,查找效率当属hash。所以,这里我们就将链表和hash结合起来,利用空间换时间的思想,实现LRU算法。
LRU具体概念就不列出了,本文的目的是进一步了解LRU算法和学习高效的编程方法。
代码如下:
实际算法并不难,但是高效解决问题的思想是值得学习的。也让我们更加了解LRU缓存算法了。
LRU算法实现并不难,但是要高效地实现却是有难度的,要想高效实现其中的插入、删除、查找,第一想法就是红黑树,但是红黑树也是一种折中的办法。插入、删除效率最高当属链表,查找效率当属hash。所以,这里我们就将链表和hash结合起来,利用空间换时间的思想,实现LRU算法。
LRU具体概念就不列出了,本文的目的是进一步了解LRU算法和学习高效的编程方法。
代码如下:
class LRUCache{ private: //LRU数据结构 struct Node{ int key; int value; Node(int k,int v):key(k),value(v){} }; public: LRUCache(int c):capacity(c) {} int get(int key){ if (cacheMap.find(key) == cacheMap.end()) return -1; //这里产生缺页中断,根据页表将页面调入内存,然后set(key, value) //将key移到第一个,并更新cacheMap cacheList.splice(cacheList.begin(),cacheList,cacheMap[key]); cacheMap[key] = cacheList.begin(); return cacheMap[key]->value; } void set(int key, int value){ if (cacheMap.find(key) == cacheMap.end()) { //淘汰最后一个,然后将其加到第一个位置 if (cacheList.size() == capacity) { cacheMap.erase(cacheList.back().key); cacheList.pop_back(); } cacheList.push_front(Node(key,value)); cacheMap[key] = cacheList.begin(); } else { //更新节点的值,并将其加到第一个位置 cacheMap[key]->value = value; cacheList.splice(cacheList.begin(),cacheList,cacheMap[key]); cacheMap[key] = cacheList.begin(); } } private: int capacity; list<Node> cacheList; unordered_map<int, list<Node>::iterator> cacheMap; };
实际算法并不难,但是高效解决问题的思想是值得学习的。也让我们更加了解LRU缓存算法了。
相关文章推荐
- VC++, CString的各个函数用法详解与小示例
- Effective C++ 条款43 学习处理模板化基类内的名称
- C和C++键盘输入函数总结
- c++大数模版
- C++11的mutex和lock_guard,muduo的MutexLock 与MutexLockGuard
- C++ Set常用用法
- c++嵌套类--有疑问
- 简单讲解C++的内部和外部函数以及宏的定义
- 【C++】调整数组顺序使奇数位于偶数前面
- C语言实现的一个链式栈
- (转)C++中extern “C”含义深层探索
- 深入理解C++中变量的存储类别和属性
- OC语言-字符串总结
- 编译原理:文法类型判断C++实现
- Intel Edison C++ 开发之I2C-深入MRAA开发
- 【C++】智能指针之引用计数的实现
- [C++] volatie关键字
- C++类内存分布
- C++标准转换运算符const_cast
- 用栗子打倒C++多态