双端链表实现LRUCache

Memcached的实现核心就是一个LRU算法,它使用双端链表实现。
下面也是一个简单的用双端链表实现的单例LRU Cache,大家可以根据自己的需要添加一些方法。
package lruCache;

import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

public class LRUCache {
private static Map<Object, DoubleLinkedListNode> map = new HashMap<Object, DoubleLinkedListNode>();
private DoubleLinkedListNode head;
private DoubleLinkedListNode end;
private int len;
private int capacity;

private static LRUCache singleton = null;

public static LRUCache getInstance(int capacity){
if(null == singleton){
singleton = new LRUCache(capacity);
}
return singleton;
}

private LRUCache(int capacity) {
this.capacity = capacity;
len = 0;
}

public Object get(Object key) {
if(map.containsKey(key)){
DoubleLinkedListNode latest = map.get(key);
removeFromList(latest);
setHead(latest);
return latest.val;
}
else{
return null;
}
}

public void set(Object key, Object value) {
if (map.containsKey(key)) {
DoubleLinkedListNode oldNode = map.get(key);
oldNode.val = value;
removeFromList(oldNode);
setHead(oldNode);
} else {
DoubleLinkedListNode newNode =
new DoubleLinkedListNode(key, value);
if (len < capacity) {
setHead(newNode);
map.put(key, newNode);
len++;
} else {
map.remove(end.key);
end = end.pre;
if (end != null) {
end.post = null;
}

setHead(newNode);
map.put(key, newNode);
}
}
}

private void removeFromList(DoubleLinkedListNode node){
if(node.pre != null){
node.pre.post = node.post;
}
else{
head = node.post;
}
if(node.post != null){
node.post.pre = node.pre;
}
else{
end = node.pre;
}
}

private void setHead(DoubleLinkedListNode node){
node.post = head;
node.pre = null;
if (head != null) {
head.pre = node;
}

head = node;
if (end == null) {
end = node;
}
}

//返回当前Cache中key的集合
public Set<Object> keySet(){
Set<Object> res = new LinkedHashSet<Object>();
DoubleLinkedListNode cur = head;
while(null != cur){
res.add(cur.key);
cur = cur.post;
}
return res;
}

private class DoubleLinkedListNode{
Object key;
Object val;
DoubleLinkedListNode pre;
DoubleLinkedListNode post;
DoubleLinkedListNode(Object key, Object value){
this.key = key;
val = value;
}
}
}


测试类:
package lruCache;

import java.util.Set;

public class LRUCacheDemo {
public static void main(String[] args){
//新建一个容量为5的LRUCache
LRUCache lruCache = LRUCache.getInstance(5);
lruCache.set("1", "yi");
lruCache.set("1", "yiyi");
Set<Object> keySet = lruCache.keySet();
lruCache.set("2", "er");
lruCache.set("3", "san");
lruCache.set("4", "si");
lruCache.set("5", "wu");
lruCache.set("6", "liu");
Set<Object> keySet2 = lruCache.keySet();
}
}

lru算法C语言实现 C语言写的lru算法,验证过了,可以用。大概还是不错的 立即下载

相关推荐

电动车辆的动力总成控制

手把手教你学Simulink——电动车辆的动力总成控制在汽车工程领域,电动汽车(EV)的动力总成控制系统是确保车辆性能、效率和驾驶体验的关键。动力总成控制系统通常包括电机控制、电池管理系统(BMS)、能量回收系统等组件。通过使用Simulink,我们可以模拟和测试这些系统的运行情况,优化设计,并验证控制算法的有效性。

amy_mhd的博客 967

双向链表实现Lru算法

Lru算法实现:节点依次在链表头部插入,链表尾部即为最近最少使用的节点,当key重复时,新增节点覆盖原有节点,查找时,将查找到的节点放到链表头部。 /** * @author spark * @version 1.0 */ public class MyLRU { /** * 定义双向链表 */ static class LinkedNode { ...

mannnn__的博客 3189

SAP传输请求全流程详解:从SE10创建到STMS跨环境部署(附常见错误排查)

本文详细解析了SAP传输请求的全流程,从SE10创建到STMS跨环境部署,并提供了常见错误排查方法。涵盖工作台请求、定制请求等类型,以及STMS传输原理和实战操作技巧,帮助用户高效管理SAP系统变更。

weixin_29214335的博客 143

用hash map和双向链表实现LruCache

之前介绍过hash table, 也介绍过hash map, 当然, 双向链表也早就说过, 现在来看看如何用这些东西来实现一个LruCache, 直接上代码: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;ext/hash_map&gt; // for hashmap using name...

认知 行动 坚持 4710

Loupe Browser实战指南:解锁10xGenomics单细胞数据的可视化奥秘

本文提供了Loupe Browser的实战指南,帮助用户无需编程即可探索和可视化10xGenomics单细胞数据。文章详细介绍了从数据导入、界面导航到细胞亚群鉴定、差异基因分析的核心操作流程,并分享了高级技巧与避坑指南,是快速上手这一强大可视化工具的必备参考。

weixin_29313423的博客 206

从零开始:如何用大语言模型构建你的第一个路径规划智能体

本文详细介绍了如何利用大语言模型(LLM)构建路径规划智能体,从基础概念到实战案例,涵盖TSP和CVRP问题的解决方案。通过选择合适的LLM模型、设计有效的提示工程和实现自我验证,即使没有运筹学背景也能快速上手。文章还提供了部署与优化智能体的实用技巧,帮助读者在物流配送、机器人导航等领域应用这一技术。

weixin_28256233的博客 485

双向链表实现的简易缓存(LRU Cache)

问题: 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 th

嘻嘻哈哈在成长 1415

Python头歌实验题目(2024版)

武汉理工大学头歌平台实验题目

2401_84152595的博客 2万+

java LRU实现

LRU缓存: LRU缓存利用了这样的一种思想。LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,也就是说,LRU缓存把最近最少使用的数据移除,让给最新读取的数据。而往往最常读取的,也是读取次数最多的,所以,利用LRU缓存,我们能够提高系统的performance. 实现: 要实现LRU缓存,我们首先要用到一个类 LinkedHashMap。 用这个类有...

水之湄 349

Python实战:用SkillMetrics库5分钟搞定泰勒图绘制(附完整代码)

本文详细介绍了如何使用Python的SkillMetrics库快速绘制专业泰勒图,以直观对比多个模型的预测性能。通过整合相关系数、标准差和中心化均方根误差三个核心指标,该工具能帮助数据科学家和研究者高效完成模型评估与可视化,提升分析报告质量。文章提供了从环境配置、数据准备到高级定制与子图对比的完整代码示例。

7z8x2c4v6b9的博客 371

基于YOLO26的实时目标追踪实战:从训练到视频追踪(附完整可视化代码)

核心组合:YOLO26(高精度检测)+ ByteTrack(稳定追踪)是实时目标追踪的最优工业组合,Ultralytics内置集成无需额外开发;训练优化:追踪场景需优先提升检测框精度(增加box损失权重),保证ID稳定性;可视化核心:为每个ID分配唯一颜色、绘制运动轨迹、显示FPS,是落地场景的必备功能;性能调优:轻量化模型+降分辨率+OpenVINO导出,可在边缘设备(如研华工控机)实现实时追踪。这套代码可直接复用到智慧园区、停车场、工业产线等场景,仅需修改park.yaml中的类别和。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 571

LRUCache缓存机制

LRUCache Leetcode上的LRUCache缓存机制,实现get和put时时间复杂度O(1). // #include<iostream> #include<map> using namespace std; //------------------------leetcode LRUCache----------------------------// // ...

qq_36938255的博客 323

《MPDIoU:边界框回归的高效革新与YOLOv8集成实战指南》

摘要: MPDIoU(多优先级距离IoU)通过引入中心距离、形状差异和尺度变化的三步优化策略,解决了传统IoU在目标检测中的尺度敏感、收敛低效和场景局限问题。相较于GIoU、DIoU等主流方法,MPDIoU在精度、速度和鲁棒性上实现全面提升,尤其在复杂场景和小目标检测中表现突出。通过代码集成和训练优化,MPDIoU在YOLOv8中显著提升COCO数据集AP指标,并在智能安防(密集行人检测)和工业质检(微小缺陷定位)等垂直领域验证了其应用价值。未来研究方向包括动态权重调整和多模态融合,进一步拓展边界框回归的精

m0_64661770的博客 158

146. LRU 缓存

这道题是在类下实现的,第一次做到这样的题目。难点是常数级的get和put。get利用哈希表即可实现,put需要利用双端链表来实现,具体见代码。

weixin_54385104的博客 71

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

手撕一个LRU Cache

前言 今天时间紧张,借一道经典面试题简单聊两句吧。 LeetCode 146 - LRU Cache 最近最少使用缓存(LRU Cache)是一种简单而高效的缓存机制,其思想基于局部性原理,在CPU缓存管理、操作系统内存管理以及Redis、Memcached等内存数据库中有非常重要的地位。下面来按照题目要求实现一个最简单的LRU Cache。 Design a data structure th...

LittleMagic's Blog 811

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【重温经典】LRU 缓存机制

需要一个哈希双端链表,DoubleLinkedNodeDoubleLinkedNodeDoubleLinkedNode 这个双端链表有下面的几个属性 class DoubleLinkedNode { int key, value;//k,v DoubleLinkedNode pre, next;//前驱接节点,后继节点 public DoubleLinkedNode(int key, int value) { ..

wat1r的博客 165

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LRU Cache(Least Recent Used缓存)

在有限内存空间中,抛弃距当前时间最远被使用(访问)的元素的缓存的数据结构,能够添加元素,读取元素。这个数据结构在操作系统中经常被使用到,见wikipedia链接https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)。 使用一个双端链表和一个HashMap可以在O(1)时间、O(n)空间内...

To_be_thinking的博客 398

什么是LRUCache 和 LRUCache 实现

1.什么是LRUCache ? Least-Recently-Used 替换掉最近最少使用的对象(如 redis缓存策略) 缓存剔除策略,当缓存空间不够用的时候需要一种方法剔除key 常用的有 LRU(从使用的时间下手把时间长剔除掉) , LFU(从使用次数下手把次数最少剔除掉)等 LRU通过使用一个循环双端队列不断把最新访问的 Key 放到表头,就是把最新访问的放到最前(右边),...

晓康的博客 2567

Python - 深夜数据结构与算法之 LRUCache

Python LRU Cache 简介与算法练习。

BITDDD小栈 2098

LRUCache实现

LRUCache实现 在面试中,我们经常听到说LRU这个关键词,那么我们需要了解什么是LRU,我的理解是,LRU是一种淘汰策略,我们都知道操作系统的内存更替策略、Redis的缓存淘汰策略都有它的一个影子。那么要知其所以然,我们还得需要手工实现它,那么这里我给出一个实现是基于双端链表+哈希表的,这里并没有考虑到并发的场景,如果读者想去优化,可以给缓存加入读写锁ReentrantReadWriteLock。 public static class LRUCache { private static cl

m0_60255778的博客 268

Android内存缓存——理解LruCache和LinkedHashMap

博主最近在学习Bitmap高效加载和3级缓存(内存缓存、本地缓存和网络缓存)管理。LruCache(least recent used cache)是一种高效且普遍使用的管理策略。因此,便开启了LruCache源码学习之旅。 注意,本文中涉及的LruCache源码为support v4包中的LruCache。 1 LruCache结构 private final LinkedHashMa...

lyzirving的博客 703

数据结构LRUCache(Least Recently Used – 最近最少使用缓存)

题目要求:    设计一个数据结构,实现LRU Cache的功能(Least Recently Used – 最近最少使用缓存)。它支持如下2个操作: get 和 put。    int get(int key) – 如果key已存在,则返回key对应的值value(始终大于0);如果key不存在,则返回-1。    void put(int key, int value) – 如果key不存在,...

qq_41922018的博客 1357

【python数据结构】链表实现LRU存储

#!/usr/bin/env python # -*- coding: utf-8 -*- # @File : 链表实现LRU缓存池.py # @Date : 2019/3/25 0025 # @Contact : 1329778364@qq.com # @Author: DeepMan """ 利用python基本数据结构实现LRU缓存池 """ from collections i...

weixin_37206602的博客 559

leetcode 146. LRU 缓存

Map LinkedList 缓存

Michael_Jay的博客 1303

手撕LRU缓存——LinkedHashMap简易源码

首先我们要知道什么是LRU就是最小使用淘汰。怎么淘汰,链表尾部就是最不常用的直接删除,最近使用过的就移动到链表头部。要查找就利用hash表进行映射查找。原理非常简单,一个双端链表配上一个hash表。

每天努力Coding 962

[LeetCode] LRU Cache

https://leetcode.com/problems/lru-cache/#/description 很重要的练习题。双端链表+哈希表。 关键的操作是从链表中取出一个节点再放入链表尾部。 class LRUCache { public: // @param capacity, an integer LRUCache(int capacity) { t...

Sari_2015的博客 159
上一篇: 字符串全排列 java实现
下一篇: Unix下面安装protobuf并生成java对象的步骤
iteye_1914
博客等级 码龄8年 2粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值