算法知识点————【LRU算法】

思想:淘汰最久没有使用的

应用场景:手机清后台的时候先清最久没有使用的应用

设计一种数据结构:接收一个 capacity 参数作为缓存的最大容量,然后实现两个 API,一个是 put(key, val) 方法存入键值对,另一个是 get(key) 方法获取 key 对应的 val,如果 key 不存在则返回 -1。要求:get 和 put 方法必须都是 O(1) 的时间复杂度。

哈希链表:哈希的查找配合双向链表的快速插入和删除

cpp 复制代码
class Node{
public:
  int key,value;
  Node *prev,*next;
  Node(int k =0 ,int v =0 ) : key(k),value(v){}
};
class LRUCache{
private:
	int capacity;
    Node* dummy;//哨兵
    unordered_map<int,Node*> key_to_value;
  
  //删除节点
  void remove(Node * x){
    x->prev->next = x->next;
    x->next->prev = x->prev;
  }
  //添加节点 放到最上面
  void put_front(Node * x){
    x->prev = dummy;
    x->next = dummy->next;
    x->prev->next = x;
    x->next->prev = x;
  }  
  //获取节点 抽出放在最上面
  Node* get_node(int key){
    auto it = key_to_value.find(key);
    if(it == key_to_value.end()) return nullptr;//没找到
    auto node = it->second;//找到的话 map的node节点返回
    remove(node);
    put_front(node);
    return node;
  }
public:
  LRUCache(int capacity) : capacity(capacity),dummy(new Node()){
    dummy->prev  = dummy;
    dummy->next = dummy;
  }
  int get(int key){
    auto node = get_node(key);
    return node? node->value:-1;
  }
  void put(int key,int value){
    auto node = get_node(key);
    if(node){//有这本书
      node->value = value;
      return ;
    }
    key_to_value[key] = node = new Node(key,value);//没有这本书
    put_front(node);//添加
    if(key_to_value.size() > capacity){//添加得判断
      auto node_back = dummy->prev;
      key_to_value.erase(node_back->key);
      remove(node_back);
      delete node_back;
    }
  }
  
};
相关推荐
m0_7380545614 分钟前
【leetcode】全排列 回溯法
c++·算法·leetcode·回溯法
ZZZ_O^O26 分钟前
【贪心算法第五弹——300.最长递增子序列】
c++·学习·算法·leetcode·贪心算法
呼啦啦啦啦啦啦啦啦29 分钟前
刷题日常(移动零,盛最多水的容器,三数之和,无重复字符的最长子串)
算法·双指针·滑动窗口
Koishi_TvT30 分钟前
蓝桥杯c++算法秒杀【6】之动态规划【下】(数字三角形、砝码称重(背包问题)、括号序列、异或三角:::非常典型的必刷例题!!!)
c语言·c++·算法·性能优化·蓝桥杯·动态规划·c
孤独且没人爱的纸鹤31 分钟前
C++ 二叉搜索树(Binary Search Tree, BST)深度解析与全面指南:从基础概念到高级应用、算法优化及实战案例
c语言·数据结构·c++·算法
YuanLiu_2271 小时前
代码随想录算法训练营第十三天(递归遍历;迭代遍历;统一迭代;层序遍历)
java·数据结构·笔记·算法·leetcode
闻缺陷则喜何志丹1 小时前
【C++动态规划】1411. 给 N x 3 网格图涂色的方案数|1844
c++·算法·动态规划·力扣·网格·数目·涂色
仙俊红1 小时前
快速运行openMMOCR
深度学习·算法
-Max-静-2 小时前
Paddle Inference部署推理(十八)
人工智能·windows·深度学习·算法·paddle·推理 部署
qq_485668992 小时前
算法习题--蓝桥杯
算法·职场和发展·蓝桥杯