LRU是Least Recently Used的缩写,即最近最少使用,是一种经常使用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每一个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。html
LRU正如咱们平常生活时使用手机那样子:咱们会打开多个应用,在后台应用管理能够看到你打开的应用列表,最近的开的排的靠前,比较旧的没用就靠的比较后了。但是,要知道,咱们的手机内存是有限的,若是开太多应用,把内存都占满,那么手机就特别卡了。因此,在这时候,手机会自动清理内存,过程以下:会将最久未使用的应用程序进程中止(断定为无用的数据),就是按照时间来,而后停掉倒数第二久未使用的应用......以此类推,直到有足够空间才中止清理。若是你又去访问未中止的应用,那么他就跳到了咱们后台应用列表的第一个了。算法
LRU算法就是这样的,将最久、最少使用的数据进行淘汰。缓存
若是叫咱们设计一个LRU算法如何设计呢?spa
要接受一个最大的缓存容量 capacity设计
实现两个方法:code
使用双向链表和哈希表的结合实现LRU算法: 哈希表的查找速度快,可是是无序的; 而链表是有序的, 可是查找速度慢, 为\(O(N)\), 因此咱们能够利用这两个特性,结合起来,造成了哈希链表, 这样的话,get和put都是\(O(1)\)的时间复杂度了, 图解以下:htm