【数据结构与算法】LRUCache

news/2024/11/13 9:08:12/

实现LRUCache

  • LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向z存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

// 结点类
struct Node {int key_, value_;Node *prev, *next;Node(int k = 0, int v = 0): key_(k), value_(v), prev(nullptr), next(nullptr) {}
};class LRUCache {
public:int size_, cap_;Node *head, *tail;unordered_map<int, Node *> h;LRUCache(int capacity) {size_ = 0;cap_ = capacity;head = new Node();tail = new Node();head->next = tail;tail->prev = head;}int get(int key) {if(!h.count(key)) {return -1;} else { // 访问一个元素后,将其移动到头结点RemoveNode(h[key]);AddNodeToHead(h[key]);return h[key]->value_;}}void put(int key, int value) {if(h.count(key)) {RemoveNode(h[key]);AddNodeToHead(h[key]);h[key]->value_ = value;} else {if(size_ == cap_) { // LRU容量不够,删除链表尾元素h.erase(tail->prev->key_);RemoveNode(tail->prev);size_--;}h[key] = new Node(key, value);AddNodeToHead(h[key]);size_++;}}// 从双向链表中删除某个结点void RemoveNode(Node *node) {node->prev->next = node->next;node->next->prev = node->prev;}// 将node插入到头结点之后void AddNodeToHead(Node *node) {node->prev = head;node->next = head->next;head->next->prev = node;head->next = node;}
};

http://www.ppmy.cn/news/1545928.html

相关文章

网络安全常见面试题--含答案

本文面试题汇总&#xff1a; 防范常见的 Web 攻击 重要协议分布层 arp协议的工作原理rip协议是什么&#xff1f;rip的工作原理 什么是RARP&#xff1f;工作原理OSPF协议&#xff1f;OSPF的工作原理 TCP与UDP区别总结 什么是三次握手四次挥手&#xff1f; tcp为什么要三次握手&…

力扣第46题“全排列”

题目描述 给定一个没有重复数字的整数数组 nums&#xff0c;返回其所有可能的排列。 示例&#xff1a; 输入: nums [1,2,3] 输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] ]解题思路 回溯法&#xff1a;通过递归构建排列&#xff0c;每次选择一个未使用的数字添…

《数据结构》--二叉树【上】

&#x1f333;树的基础内容 树的定义&#xff1a; 树是一种数据结构&#xff0c;它是由n(n>1)个有限节点组成的一个具有层次关系的集合。把它叫做"树"是因为它看起来像一颗倒挂着的树&#xff0c;也就是说它是根在上&#xff0c;叶在下的。 树的特点&#xff1a…

openresty入门教程:init_by_lua_block

init_by_lua_block 是 Nginx 配置中用于在 Nginx 启动时执行 Lua 脚本的一个指令。这个指令通常用于初始化全局变量、设置共享内存&#xff0c;或者执行一些需要在服务器启动时完成的准备工作。 以下是一个简单的 init_by_lua_block 使用示例&#xff1a; 1. 安装 Nginx 和 L…

从0开始学习机器学习--Day20--优化算法的思路

确定执行的优先级(Prioritizing what to work on : Spam classification example) 在建立学习系统前&#xff0c;我们不仅要梳理框架&#xff0c;更重要的是我们要弄清楚有哪些事情是要优先做的&#xff0c;这可以帮我们节约大量的时间。 以垃圾邮件为例&#xff0c;按照之前…

实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎

摘要&#xff1a;本文整理自阿里云智能集团研究员、开源大数据平台负责人王峰&#xff08;莫问&#xff09;老师在云栖大会的开源大数据专场上的分享。主要有以下几个内容&#xff1a; 1. Apache Flink 已经成为业界流计算事实标准 2. Flash 向量化流计算引擎核心技术解读 3. F…

24.11.6 PySimpleGUI库和pymsql 库以及人脸识别小项目

PySimpleGUI 库 PySimpleGUI 是一个用于简化 GUI 编程的 Python 包&#xff0c;它封装了多种底层 GUI 框架&#xff08;如 tkinter、Qt、WxPython 等&#xff09;&#xff0c;提供了简单易用的 API。PySimpleGUI 包含了大量的控件&#xff08;也称为小部件或组件&#xff09;&…

Kafka中如何做到数据唯一,即数据去重?

数据传递语义 至少一次&#xff08;At Least Once&#xff09; ACK级别设置为-1 分区副本大于等于2 ISR里应答的最小副本数量大于等于2 可以保障数据可靠 • 最多一次&#xff08;At Most Once&#xff09; ACK级别设置为0 • 总结&#xff1a; At Least Once可以保证数据不…