【题目】

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.

【题意】

实现LRU策略

1. 依据key取value

2. 插入key-value时,须要删除LRU的item

【思路】

维护一个Map记录相应的<key, value>对

        为了模拟key的訪问先后关系,须要维护一个訪问次序列表,越靠后的节点,訪问时间距当前时间越短

而在insert或者訪问key的时候,须要从列表中找到相应的key,并把它调整到列表为。

这里遇到两个问题,一个是查找,还有一个是移动到末尾



假设使用顺序表,查找O(n),移动O(n),在cache规模非常大时时间代价过高

因此这里使用双向链表来处理

【代码】

struct Node{
int key;
int val;
Node*prev;
Node*next;
Node(int k, int v): key(k), val(v){
prev=NULL; next=NULL;
}
}; class LRUCache{
private:
Node* head;
Node* tail;
int capacity;
map<int, Node*>cache;
public:
LRUCache(int capacity) {
this->head = NULL;
this->tail = NULL;
this->capacity = capacity;
} void move2tail(Node* node){
if(node==tail)return;
if(node==head){
head = node->next;
head->prev=NULL;
tail->next=node;
node->prev=tail;
tail=node;
tail->next=NULL;
}
else{
node->prev->next = node->next;
node->next->prev = node->prev;
tail->next=node;
node->prev=tail;
tail=node;
tail->next=NULL;
}
} int get(int key) {
if(this->cache.find(key)==this->cache.end())return -1;
move2tail(this->cache[key]);
return this->cache[key]->val;
} void set(int key, int value) {
if(this->cache.find(key)==this->cache.end()){//cache中还没有
if(this->capacity==0){//cache已经满了
//删除头结点
this->cache.erase(head->key);
head=head->next;
if(head)head->prev=NULL;
else tail=NULL;
}
else{//cache还没满
this->capacity--;
}
//加入新节点
Node* newNode=new Node(key, value);
this->cache[key]=newNode;
if(tail){
tail->next=newNode;
newNode->prev=tail;
tail=newNode;
tail->next=NULL;
}
else{
head=tail=newNode;
}
}
else{//cache中已经有了
this->cache[key]->val = value;
move2tail(this->cache[key]);
}
}
};

LeetCode: LRU Cache [146]的更多相关文章

  1. [LeetCode] LRU Cache 最近最少使用页面置换缓存器

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  2. [LeetCode]LRU Cache有个问题,求大神解答【已解决】

    题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...

  3. LeetCode:LRU Cache

    题目大意:设计一个用于LRU cache算法的数据结构. 题目链接.关于LRU的基本知识可参考here 分析:为了保持cache的性能,使查找,插入,删除都有较高的性能,我们使用双向链表(std::l ...

  4. LeetCode——LRU Cache

    Description: Design and implement a data structure for Least Recently Used (LRU) cache. It should su ...

  5. LeetCode – LRU Cache (Java)

    Problem Design and implement a data structure for Least Recently Used (LRU) cache. It should support ...

  6. Leetcode: LRU Cache 解题报告

    LRU Cache  Design and implement a data structure for Least Recently Used (LRU) cache. It should supp ...

  7. [LeetCode] LRU Cache [Forward]

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  8. Leetcode:LRU Cache,LFU Cache

    在Leetcode上遇到了两个有趣的题目,分别是利用LRU和LFU算法实现两个缓存.缓存支持和字典一样的get和put操作,且要求两个操作的时间复杂度均为O(1). 首先说一下如何在O(1)时间复杂度 ...

  9. leetcode LRU Cache python

    class Node(object): def __init__(self,k,x): self.key=k self.val=x self.prev=None self.next=None clas ...

随机推荐

  1. sql 合并相同条件的字段

    案例:将 Albums 字段相同的数据的 PhotoUrl 字段 拼接到一起(我写的是前9行,可以去掉) 一.表的结构 二.sql 语句(为了方便 我加了一个条件[Albums=783] ) ) '; ...

  2. 【Eclipse】Failed to load the JNI shared library

    这是因为JDK配置错误所导致的现象. 一般说来,新购笔记本会预装64位的windows系统,而在网上下载软件时,32位会优先出现在页面中(现在来说是这个情况,但我认为未来64位会越来越普及). 如果你 ...

  3. [Swust OJ 491]--分数的位置(简单版)

    题目链接:http://acm.swust.edu.cn/problem/0491/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  4. BZOJ 1911: [Apio2010]特别行动队( dp + 斜率优化 )

    sum为战斗力的前缀和 dp(x) = max( dp(p)+A*(sumx-sump)2+B*(sumx-sump)+C )(0≤p<x) 然后斜率优化...懒得写下去了... ------- ...

  5. JavaScript 、ECMAScript、commonJS 发展历史 与标准化发展

    本文介绍下JavaScript和 ECMAScript的诞生及发展历史,以及标准化过程. 一.JavaScript诞生 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版. ...

  6. Ajax 实现无刷新分页

    Ajax 实现无刷新分页

  7. java 发送邮件 email相关操作代码测试,生成复杂格式邮件,发送邮件相关操作

    项目源码下载:http://download.csdn.net/detail/liangrui1988/6720047 效果图: 相关代码: test1 package com.mail; impor ...

  8. 一天一个类,一点也不累之TreeSet

    一天一个类,一点也不累. 现在要说的是---TreeSet public class TreeSet<E> extends AbstractSet<E> implements ...

  9. Python中__init__方法介绍

    本文介绍Python中__init__方法的意义.         __init__方法在类的一个对象被建立时,马上运行.这个方法可以用来对你的对象做一些你希望的 初始化 .注意,这个名称的开始和结尾 ...

  10. the Meta-Object Compiler (moc)

    the Meta-Object Compiler (moc) 元对象编译器是处理Qt的C++扩展的程序. moc工具读取C++头文件,如果它找到一个或者多个类声明包含Q_OBJECT宏.它生为那些类成 ...