leetcode_LRU Cache_easy-缓存相关

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.

方法:使用list存储key,value,使用unordered_map存储key和数据的地址(用unordered_map因为它查找性能好,底层是哈希实现的,一般O(1),而且C++11将其设置为标准),而map底层是红黑树实现的,查找性能一般是稳定在O(log(n)).

#include <iostream>
#include <unordered_map>
#include <list>
#include <utility>
using namespace std;
//using namespace stdext;
using namespace std::tr1;

class LRUCache{
public:
	LRUCache(int capacity) {
		this->capacity=capacity;
	}

	int get(int key) {
		if(cacheMap.find(key)==cacheMap.end())//没有找到数据
			return -1;
		else
		{
			cacheList.splice(cacheList.begin(),cacheList,cacheMap[key]);//将本条数据移动到链表头部(最近访问的数据),目的是提高命中率(链表头部到链表尾部,频率依次降低)
			cacheMap[key]=cacheList.begin();//更新哈希表
			return cacheMap[key]->second;//返回值
		}
	}

	void set(int key, int value) {
		if(cacheMap.find(key)!=cacheMap.end())//缓存中已经有此key
		{
			cacheMap[key]->second=value;//更新值
			cacheList.splice(cacheList.begin(),cacheList,cacheMap[key]);//因为再次被set,说明访问频率高,将此记录移动到链表头部,O(1)
			cacheMap[key]=cacheList.begin();//更新哈希表中地址
		}
		else//缓存中没有此key
		{
			if(cacheList.size()<capacity)//缓存未满
				cacheList.push_front(make_pair(key,value));//将新数据插入到链表头部
			else//缓存已经满了
			{
				cacheMap.erase(cacheList.back().first);//删除哈希表中对应链表尾部节点的数据
				cacheList.pop_back();//删除链表尾部节点(被访问频率较低的数据)
				cacheList.push_front(make_pair(key,value));//将新数据插入到链表头部
			}
			cacheMap[key]=cacheList.begin();//将地址写到哈希表中
		}
	}

private:
	list< pair<int,int> > cacheList;//每个元素记录key,value
	unordered_map< int,list< pair<int,int> >::iterator > cacheMap;//记录元素的key对应的cacheList内的地址,主要是为了加快查找速度(一般O(1),如果rehash可能会不止)
	int capacity;//cache能装下的记录数量
};

int main()
{
	LRUCache cache(10);
	cache.set(2,33);
	cache.set(1,11);
	cout<<cache.get(1)<<endl;
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 22:14:48

leetcode_LRU Cache_easy-缓存相关的相关文章

InnoDB缓存相关

InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理.在数据库系统中,由于CPU速度和磁盘速度之前的鸿沟,通常使用缓冲池技术来提高数据库的整体性能. 1. Innodb_buffer_pool 缓冲池(buffer pool)简单来说就是一块内存区域.缓冲池中缓存的数据页类型有:索引页.数据页.undo页.插入缓冲.自适应哈希索引.InnoDB存储的锁信息.数据字典信息等.不能简单认为,缓冲池只是缓存索引页和数据页,它们只是占缓冲池很大的一部分而已. 在数据库中进行读取页的操

浏览器缓存相关http头

最近看雅虎黄金34条,学习下优化网站性能的方法.其中有一条:"为文件头指定Expires或Cache-Control",具体来说指对于静态内容:设置文件头过期时间Expires的值为"Never expire"永不过期:而对于动态内容:使用恰当的Cache-Control文件头来帮助浏览器进行有条件的请求. 这一条可以和雅虎34条的第一条联系起来,那就是尽量减少http的请求次数(雅虎34条很多都是努力去减少http请求为目的的),毕竟如果有太多的资源需要下载需要新

php缓存相关

在php运行期间,php引擎要对php源码进行处理,(词法分析,语法分析等)然后生成opcode. 然后再运行.在这个阶段可以把opcode缓存起来,当下次需要运行这段程序的时候,就避免了再次 进行词法分析,语法分析,直接拿opcode来用. eAccelerator就是这样的程序. 用vld查看php的opcode: http://pecl.php.net/package/vld/0.12.0/windows 在上面的地址下载vld,解压后 将 php_vld.dll,拷贝到ext目录下. 修

Django的contenttypes应用、缓存相关

一.django的contenttypes contenttypes 是Django内置的一个应用 , 可以追踪项目中所有app 和 model 的对应关系, 并记录djang_content_type 表中. 每当我们创建了新的model 并执行数据库迁移后 , django_content_type 表中就会自动新增一条记录 , 比如我在应用pp01的models.py中创建表class Electrics(models.Model): pass.从数据库查看django_content_t

python后端面试第二部分:数据储存与缓存相关--长期维护

##################    数据储存与缓存相关        ####################### mysql数据库, redis数据库, 原文地址:https://www.cnblogs.com/andy0816/p/12228500.html

session 一级缓存相关

Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应. Session 能够在某些时间点, 按照缓存中对象的变化来执行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为刷新缓存(flush). hibernate把对象分为三种状态:Session 的特定方法能使对象从一个状态转换到另一个状态. •flush:Session 按照缓存中对象的属性变化来同步更新数据库: •默认情况下 Session 在以下时间点刷新缓存: –显式调用 Session

Android系统缓存相关

1. 如何获取每个应用的缓存文件及大小 PackageManager pm = context.getPackageManager(); try { Method mmethod = PackageManager.class.getMethod("getPackageSizeInfo", String.class,IPackageStatsObserver.class); List<PackageInfo> packageInfos = pm.getInstalledPac

ios 缓存相关信息收集

链接:http://www.cnblogs.com/pengyingh/category/353093.html 使用NSURLCache让本地数据来代替远程UIWebView请求 摘要: 原文作者:Matt Gallagher原文链接:http://cocoawithlove.com/2010/09/substituting-local-data-for-remote.html翻译:http://disanji.net/2010/11/24/substituting-local-data-fo

nginx的proxy_cache缓存相关配置

本文主要介绍nginx的proxy_cache缓存的配置及nginx平滑升级. nginx的proxy_cache缓存用于反向代理时,对后端内容资源服务器进行缓存,缓存静态资源. 一.proxy_cache相关指令说明 1.proxy_cache指令 语法:proxy_cache zone_name; 默认值:none 使用配置段:http,server,location 该指令用于设置哪个缓存区将被使用,zone_name的值为proxy_cache_path指令创建的缓存区名称 2.prox

HTTP缓存相关属性的服务器配置

http://blog.csdn.net/goldlevi/article/details/7705160 之前和网络部门的人一起搭建我们的下载服务器,里面涉及了cache-control/expires的设置,之前每日更新也出现了文件无法下载的情况,最后发现是因为Lastmodified参数的值有变动.这里我把之前整理的与缓存有关系的HTTP头的资料和大家分享一下. 一.     基本知识: 先大概总结一下相关属性的含义. 1.Expires属性 Expires(过期时间)属性是HTTP控制缓