LeetCode 146. LRU Cache
来源:互联网 发布:wps怎么删除筛选数据 编辑:程序博客网 时间:2024/04/30 21:05
问题
实现LRU算法.
代码
hash_map + double linked list实现
每次访问key处的内存时,先在hash_map 中查找cache中地址,
1,如果找到,就在cache中进行内存操作,在结束时,将key指向的节点移动到双向链表头部。
2,如果写入时没有找到, 就在double linked list 头部加入一个节点,如果此时没有可用空间,则先要将链表最后一个节点释放。
class Node{public: Node():key(-1),val(0),pre(0),next(0){} int key, val; int pre, next;};class LRUCache{public: LRUCache(int capacity) { dl = new Node[capacity+1]; dl[0].next = 0; dl[0].pre = 0; fnptr = 1; for (int i=1; i< capacity; ++i) dl[i].next = i+1; dl[capacity].next = 0; } ~LRUCache(){delete dl;} void useNode(int ptr) { dl[dl[ptr].pre].next = dl[ptr].next; dl[dl[ptr].next].pre = dl[ptr].pre; dl[ptr].next = dl[0].next; dl[dl[0].next].pre = ptr; dl[0].next = ptr; dl[ptr].pre = 0; } void freeLast() { int del = dl[0].pre; dl[dl[del].pre].next = 0; dl[0].pre = dl[del].pre; dl[del].next = fnptr; fnptr = del; keyToNodePtr.erase(dl[del].key); } void addOne(int key, int val) { if (fnptr == 0) freeLast(); int now = fnptr; fnptr = dl[fnptr].next; dl[now].key = key; dl[now].val = val; keyToNodePtr[key] = now; dl[now].next = dl[0].next; dl[dl[0].next].pre = now; dl[0].next = now; dl[now].pre = 0; } int get(int key) { if (keyToNodePtr.count(key)) { int ptr = keyToNodePtr[key]; useNode(ptr); return dl[ptr].val; } return -1; } void set(int key, int value) { if (keyToNodePtr.count(key)) { int ptr = keyToNodePtr[key]; dl[ptr].val = value; useNode(ptr); }else{ addOne(key, value); } }private: Node *dl; // double linked list; int fnptr; // free node ptr unordered_map<int, int> keyToNodePtr;};
0 0
- LeetCode 146. LRU Cache
- [leetcode] 146.LRU Cache
- leetcode 146. LRU Cache
- Leetcode 146. LRU Cache
- Leetcode - 146. LRU Cache
- Leetcode 146. LRU Cache
- [leetcode] 146. LRU Cache
- Leetcode 146. LRU Cache
- leetcode 146. LRU Cache
- LeetCode-146. LRU Cache
- LeetCode 146. LRU Cache
- LeetCode 146. LRU Cache
- Leetcode 146. LRU Cache
- [LeetCode] 146. LRU Cache
- leetcode 146.LRU Cache
- [LeetCode]146. LRU Cache
- Leetcode 146. LRU Cache
- leetcode 146. LRU Cache
- 为什么有人说不建议建立表与表之间的主外键关系
- eclipse调试百度地图demo提示 230错误 Scode码校验失败
- Android 音乐频谱实现
- 深入浅出Java并发包—锁机制(三)
- 栈的压入、弹出序列
- LeetCode 146. LRU Cache
- kubernetes安装教程(CentOS7 )
- maven如何修改本地仓库与中央仓库
- JavaScript和Java的区别
- MAC下 Redis php扩展安装
- 欢迎使用CSDN-markdown编辑器
- 了解mongodb
- Android LayoutInflater详解
- 算法复习之快排