哈希表和双向链表实现LRU

news2024/12/23 4:07:10

 LRU(Least Recently Used)即最近最少使用,是一种内存管理算法。最近在Linux的缓冲区管理也看到了使用LRU算法,即利用哈希表进行 O(1) 复杂度的快速查找,利用双向链表(里面的元素是缓冲头)对缓冲块进行管理和更新。每次更新或者获取缓冲块都将对应的缓冲头挪到链表的头部:

#include <iostream>
#include <map>
#include <memory>

using namespace std;

class LRU {
public:
    struct Node {
        Node(int key = 0, int value = 0)
        : m_key(key), m_value(value), prev(nullptr), next(nullptr) {}
        int m_key;
        int m_value;
        Node* prev;
        Node* next;
    };
public:
    LRU(int capacity) : m_capacity(capacity) {
        head = new Node;
        tail = new Node;
        tail->prev = head;//tail point to head
        head->next = tail;//head point to tail
    }
    ~LRU() {
        deleteNode(head);
        deleteNode(tail);
    }
    int get(int key) {
        if (m_map.find(key) == m_map.end())
            return -1;
        Node* node = m_map[key];
        removeNode(node);
        addToHead(node);
        return node->m_value;
    }
    void put(int key, int value) {
        if (m_map.find(key) != m_map.end()) {
            Node* node = m_map[key];
            node->m_value = value;
            removeNode(node);
            addToHead(node);
        } else {
            if (m_map.size() >= m_capacity) {
                Node* tailPrev = tail->prev;
                removeNode(tailPrev);
                m_map.erase(tailPrev->m_key);
                deleteNode(tailPrev);
            }
            Node* newNode = new Node(key, value);
            //m_map.insert(std::make_pair(key, newNode));
            m_map[key] = newNode;
            addToHead(newNode);
        }
    }
    void removeNode(Node* node) {
        if (node == nullptr)
            return;
        node->prev->next = node->next;
        node->next->prev = node->prev;
    }
    void deleteNode(Node* node) {
        if (node == nullptr)
            return;
        delete node;
        node = nullptr;
    }
    void addToHead(Node* node) {
        node->next = head->next;//before
        head->next->prev = node;
        node->prev = head;
        head->next = node;//after
    }
private:
    int m_capacity;
    std::map<int, Node*> m_map;
    Node* head;
    Node* tail;
};

int main(int argc, char* argv[])
{
	LRU cache(2);
    cache.put(1, 1);
    cache.put(2, 2);
    cout << "cache.get(2)" << cache.get(2) << endl;
    cache.put(3, 3);
    cout << "cache.get(1)" << cache.get(1) << endl;
    cache.put(4, 4);
    cout << "cache.get(2)" << cache.get(2) << endl;
    cout << "cache.get(3)" << cache.get(3) << endl;
    cout << "cache.get(4)" << cache.get(4) << endl;

}

运行结果:

参考:哈希表和双向链表实现LRU_哈希双链表-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

再次进阶 舞台王者 第八季完美童模全球赛代言人【吴浩美】赛场+秀场超燃合集

7月20-23日&#xff0c;2024第八季完美童模全球总决赛在青岛圆满落幕。在盛大的颁奖典礼上&#xff0c;一位才能出众的少女——吴浩美迎来了她舞台生涯的璀璨时刻。 代言人——吴浩美&#xff0c;以璀璨童星之姿&#xff0c;优雅地踏上完美童模盛宴的绚丽舞台&#xff0c;作为开…

【趣学Python算法100例】兔子产子

问题描述 有一对兔子&#xff0c;从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子&#xff0c;假设所有的兔子都不死&#xff0c;问30个月内每个月的兔子总对数为多少&#xff1f; 题目解析 兔子产子问题是一个有趣的古典数学问题&#xff0c…

Office关闭安全提示

每次启动都要提示这个&#xff0c;怎么关&#xff1f;

大数据-135 - ClickHouse 集群 - 数据类型 实际测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数

title: Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数 date: 2024/9/14 updated: 2024/9/14 author: cmdragon excerpt: 通过使用 Nuxt Kit 的自动导入功能,您可以更高效地管理和使用公共函数、组合式函数和 Vue API。无论是单个导入、目录导入还是从第三方模块导入…

GMB外链是什么?

GMB外链其实就是百万外链&#xff0c;它是一种通过大量反向链接来提升网站页面权重的方法。如果你刚建了一个新网站&#xff0c;想在短时间内被收录并获得排名&#xff0c;GMB外链能帮你做到这点。它不像传统SEO那样需要等待好几个月的效果&#xff0c;GMB外链能在24小时内帮你…

vector(2)

前言 通过上一节的学习&#xff0c;我们知道了vector中可以存放各种类型的数据&#xff0c;这就意味着vector之中不仅仅可以存放int、char等内置类型&#xff0c;还可以存放vector和string等类型&#xff0c;我们结合底层的具体情况来具体分析 vector的复用&#xff08;套娃&a…

光控资本:股票增发是什么意思?股票增发的形式?

股票增发配售是已上市的公司通过指定投资者&#xff08;如大股东或组织投资者&#xff09;或全部投资者额定发行股份搜集资金的融资办法。 留意&#xff1a;股票增发后&#xff0c;股价会除权下降。由于增发后股本扩大了&#xff0c;那么每股收益与每股净资产均下降&#xff0…

今天一次讲明白C++条件变量

在C中&#xff0c;std::condition_variable 条件变量是一个同步原语&#xff0c;它允许一个或多个线程在某个条件成立时&#xff0c;被另一个线程唤醒。std::condition_variable 条件变量通常与互斥锁&#xff08;std::mutex&#xff09;一起使用&#xff0c;以保护共享数据和同…

David Baker 任科学顾问,初创公司发布世界最大蛋白质相互作用数据库,已获 8 轮融资

蛋白质-蛋白质相互作用 (Protein-Protein Interactions, PPI) 是细胞生命活动的重要组成部分&#xff0c;在调控和维持细胞的生理功能中&#xff08;如细胞的信号传导、代谢反应和基因表达&#xff09;发挥着不可或缺的作用。 然而目前 PPl 数据库中的数据相对较少&#xff0c…

穿越病毒区-第15届蓝桥省赛Scratch中级组真题第2题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第187讲。 如果想持续关注Scratch蓝桥真题解读&#xff0c;可以点击《Scratch蓝桥杯历年真题》并订阅合集&#xff0c;…

CCF201912_1

题解&#xff1a; #include<bits/stdc.h>using namespace std;int n;bool shouldSkip(int num) {if (num % 7 0){return true;}while (num > 0){if (num % 10 7){return true;}num / 10;}return false; } int main() {scanf("%d", &n);int b[4] { 0…

Android Studio 安装配置教程(Windows最详细版)

目录 前言 Android Studio 下载 Android Studio 安装 Android Studio 使用 一、创建默认项目&#xff08;Compose&#xff09; 二、创建常规项目 三、使用ViewBinding 四、查看Gradle版本、SDK版本、JDK版本 ① Gradle版本 ② SDK版本 ③ JDK版本 前言 Android开发…

跟《经济学人》学英文:2024年09月14日这期 The sweet story of Peru’s blueberry boom

The sweet story of Peru’s blueberry boom Plucky farmers have transformed the market in only ten years plucky&#xff1a;英 [ˈplʌki] 勇敢的&#xff1b;无畏的&#xff1b;有胆识的 原文&#xff1a; Peru’s blueberry harvest is just beginning, and Ivan Ja…

自动驾驶:LQR、ILQR和DDP原理、公式推导以及代码演示(七、CILQR约束条件下的ILQR求解)

&#xff08;七&#xff09;CILQR约束条件下的ILQR求解 CILQR&#xff08;(Constrained Iterative Linear Quadratic Regulator)&#xff09; 是为了在 iLQR 基础上扩展处理控制输入和状态约束的问题。在这种情况下&#xff0c;系统不仅要优化控制输入以最小化代价函数&#x…

NET WPF使用组件库HandyControl

一、背景 WPF原生控件提供的API功能不够强大&#xff0c;设置一般的功能都需要进行很复杂的配置和实现。 1.1 原生按钮控件 例如&#xff0c;原生控件<Button/> 默认效果是这样的&#xff1a; MainWindow.xaml代码&#xff1a; <Window x:Class"wpf_demo.Mai…

SAP_ABAP_编程基础

SAP ABAP 顾问能力模型(同心圆方法论)_sap abap 顾问能力模型(同心圆方法论)-CSDN博客文章浏览阅读1.8k次,点赞5次,收藏35次。目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提供超级燃料!_sap abap 顾问能力模型(同心圆方法论)htt…

我们的Python服务器开发脚手架开放了

pdServer是我们实践过程中的产物&#xff0c;当我们在开发各类python应用时&#xff0c;经常需要一个server来提供服务。于是我们使用fastApi来提实现&#xff0c;并在这个过程中不断的完善&#xff0c;实现了JWT\SQL等。 我们的脚手架项目可以&#xff1a; fastApi实现一个服…

数据线电子行业MES系统功能与生产过程管理

万界星空科技针对数据线电子行业的MES系统&#xff08;制造执行系统&#xff09;&#xff0c;其具体功能、生产过程管理以及注塑机设备数据采集等方面&#xff0c;可以详细介绍如下&#xff1a; 一、电子行业MES系统具体功能 计划管理&#xff1a; MES系统能够根据客户需求和销…

潍坊网站建设-高端建站

在当今数字化时代&#xff0c;企业的在线形象越来越重要。潍坊作为一个经济发展迅速的城市&#xff0c;许多企业都意识到拥有一个高端网站的重要性。潍坊网站建设不仅仅是技术层面的开发&#xff0c;更是品牌形象和市场竞争力的体现。高端建站的核心在于用户体验、视觉设计和功…