2020-12-27 LRU算法原理

本文主要介绍一下LRU算法,least recently used,
翻译中文就是,最常使用的放在最优先级的位置,也就是按照使用的次序从近到远排序;

下面举例来说;

有 1,2,3,4,5个对象;我先使用了2,再使用了1,最后使用了3;
则顺序为: 3,1,2,4,5
这是因为最近使用的是3,其次是1,其次是2;

然后可以新加入对象,比如加入6(加入也视为一次使用),则顺序变为:
6,3,1,2,4,5

还有个需求,就是可保留的对象个数有限,比如最多就6个;
当再加入新对象时,要把最不常使用的删除;

比如加入7,则5是最不常使用的;删除,变为:
7,6,3,1,2,4

LRU是一个数据结构,主要支持两个函数
get(key), put(key,value)
含义很明显,一个是根据key,访问 值;还有一个是,把key设为对应值,要求是这两个函数都在O(1)时间完成;
类似一个map的功能,不过它有个额外能力,就是容量受限,可以把最不常用的自动删除;(或者按照从最近使用到最久使用的顺序把数据列出来)

下面我们看如何实现该结构;
从上面可以猜测用链表实现,不过链表无法实现O(1)访问,
LRU实际就是一个 hashMap + 双向List;

List中的节点是
{
key
value
}

hashMap中的值是:
{
key
ListNode*
}

也就是hashMap维护着key到链表节点的映射;

当需要访问的时候,直接通过hashMap的key O(1)索引到链表指针,进而取到value;
同时把访问的节点移动到链表首部是容易的;

下面画个图来说明:
还是用上面的例子来讲解,这里为简化假设链表中的key,value都相等,链表中就只写key了
初始:
list : n1{1} <->n2(2) <->n3{3}<->n4{4}<-> n5{5}
hash_map: (1,n1) (2,n2) (3,n3) (4,n4) (5,n5)

先使用了2:
则通过hash_map获取到 n2节点,O(1);
再通过n2得到value 2 O(1);
再把n2移动到链表首部,O(1),(因为是双向链表,很容易把该节点O(1)时间移动到首部)
整体时间为O(1),
变为:
list : n2{2} <->n1(1) <->n3{3}<->n4{4}<-> n5{5}
hash_map: (1,n1) (2,n2) (3,n3) (4,n4) (5,n5)

类似的使用了1,之后:
list : n1{1} <->n2(2) <->n3{3}<->n4{4}<-> n5{5}
hash_map: (1,n1) (2,n2) (3,n3) (4,n4) (5,n5)

使用了3之后:
list : n3{3} <->n1(1) <->n2{2}<->n4{4}<-> n5{5}
hash_map: (1,n1) (2,n2) (3,n3) (4,n4) (5,n5)

可见使用元素不改变hashMap,只改变链表;

之后加入key=6:
相当于在hashMap里插入一个元素,时间O(1),同时在链表首部插入元素也是O(1),变为,
list : n6{6}<->n3{3} <->n1(1) <->n2{2}<->n4{4}<-> n5{5}
hash_map: (1,n1) (2,n2) (3,n3) (4,n4) (5,n5) (6,n6)

之后加入key=7:
此时可以把链表尾部元素删除;同时更新map,变为:
list : n7{7}<->n6{6}<->n3{3} <->n1(1) <->n2{2}<->n4{4}
hash_map: (1,n1) (2,n2) (3,n3) (4,n4) (6,n6)(7,n7)

此时链表尾部访问速度为O(1),删除速度是O(1),hash_map删除也是O(1);

综上,就实现了LRU数据结构算法,
可见,总结一下,
LRU其实就是用hashMap的O(1)访问能力弥补了链表的访问不足;
又利用了链表的可以很方便的把某个节点移动到首部,以及有序性的特性 弥补了hashMap的顺序性缺失,
从而者结合达到预定效果;

至此LRU算法原理就以一种非常浅显易懂的方式介绍玩了,,如果觉着好,可以点个赞,加个糖果,你的支持是我继续创作的动力

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容