转自:http://www.cnblogs.com/dolphin0520/

1.FIFO算法

FIFO(First in First out),先进先出。其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度(先来先服务),为什么这个原则在很多地方都会用到呢?因为这个原则简单、且符合人们的惯性思维,具备公平性,并且实现起来简单,直接使用数据结构中的队列即可实现。

在FIFO Cache设计中,核心原则就是:如果一个数据最先进入缓存中,则应该最早淘汰掉。也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。在FIFO Cache中应该支持以下操作;

get(key):如果Cache中存在该key,则返回对应的value值,否则,返回-1;

set(key,value):如果Cache中存在该key,则重置value值;如果不存在该key,则将该key插入到到Cache中,若Cache已满,则淘汰最早进入Cache的数据。

举个例子:假如Cache大小为3,访问数据序列为set(1,1),set(2,2),set(3,3),set(4,4),get(2),set(5,5)

则Cache中的数据变化为:

(1,1)                               set(1,1)

(1,1) (2,2)                       set(2,2)

(1,1) (2,2) (3,3)               set(3,3)

(2,2) (3,3) (4,4)               set(4,4)

(2,2) (3,3) (4,4)               get(2)

(3,3) (4,4) (5,5)               set(5,5)

那么利用什么数据结构来实现呢?

下面提供一种实现思路:

利用一个双向链表保存数据,当来了新的数据之后便添加到链表末尾,如果Cache存满数据,则把链表头部数据删除,然后把新的数据添加到链表末尾。在访问数据的时候,如果在Cache中存在该数据的话,则返回对应的value值;否则返回-1。如果想提高访问效率,可以利用hashmap来保存每个key在链表中对应的位置。

2.LFU算法

LFU(Least Frequently Used)最近最少使用算法。它是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。

注意LFU和LRU算法的不同之处,LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的。举个简单的例子:

假设缓存大小为3,数据访问序列为set(2,2),set(1,1),get(2),get(1),get(2),set(3,3),set(4,4),

则在set(4,4)时对于LFU算法应该淘汰(3,3),而LRU应该淘汰(1,1)。

那么LFU Cache应该支持的操作为:

get(key):如果Cache中存在该key,则返回对应的value值,否则,返回-1;

set(key,value):如果Cache中存在该key,则重置value值;如果不存在该key,则将该key插入到到Cache中,若Cache已满,则淘汰最少访问的数据。

为了能够淘汰最少使用的数据,因此LFU算法最简单的一种设计思路就是 利用一个数组存储 数据项,用hashmap存储每个数据项在数组中对应的位置,然后为每个数据项设计一个访问频次,当数据项被命中时,访问频次自增,在淘汰的时候淘汰访问频次最少的数据。这样一来的话,在插入数据和访问数据的时候都能达到O(1)的时间复杂度,在淘汰数据的时候,通过选择算法得到应该淘汰的数据项在数组中的索引,并将该索引位置的内容替换为新来的数据内容即可,这样的话,淘汰数据的操作时间复杂度为O(n)。

另外还有一种实现思路就是利用 小顶堆+hashmap,小顶堆插入、删除操作都能达到O(logn)时间复杂度,因此效率相比第一种实现方法更加高效。

如果哪位朋友有更高效的实现方式(比如O(1)时间复杂度),不妨探讨一下,不胜感激。

LRU算法的原理以及实现在前一篇博文中已经谈到,在此不进行赘述:

fifo页面置换算法java_缓存算法(页面置换算法)-FIFO、LFU、LRU相关推荐

  1. 啊哈 算法 Java_《啊哈!算法》.啊哈磊.高清版.pdf

    这不过是一本有趣的算法书而已.和别的算法书比较,如果硬要说它有什么特点的话,那就是你能看懂它.这是一本充满智慧和趣味的算法入门书.没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点,通过幽默的语言 ...

  2. floyd算法java_利用JAVA和Floyd算法实现上海地铁最短路线搜索系统

    [实例简介] Floyd算法基于JAVA实现上海地铁最短路线搜索系统,图形界面,支持新建删除站点以及新建线路. [实例截图] [核心代码] SUBWAY └── SUBWAY ├── bin │   ...

  3. 音频降噪算法 java_音频处理之去噪算法---基于pcm和g711的音频16000hz、8bit去噪声算法...

    (1)应用背景 (2)主要降噪算法原理 (3)算法流程 (4)算法实现 (5) ------------author:pkf -------------------time:2-6 --------- ...

  4. 泰森多边形算法 java_基于java的泰森多边形算法

    [实例简介] 基于java的泰森多边形算法 [实例截图] [核心代码] f9248226-017f-4180-b6cc-dd8b1d11ae6c ├── VoroGlide │   ├── ajAni ...

  5. 操作系统:基于页面置换算法的缓存原理详解(下)

    概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...

  6. 操作系统:基于页面置换算法的缓存原理详解(上)

    概述: 作为一个学计算机的一定听过缓存(注意这里是缓存,不是缓冲).比如我们在登录网页时,网页就可以缓存一些用户信息:比如我们在写界面代码的时候,可能就会遇到界面的绘制是基于一些缓存算法的.所以,了解 ...

  7. 页面置换之最近最久未使用置换算法

    LRU(Least Recently Used)置换算法 LRU置换算法是选择最近最久未使用的页面予以淘汰.该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个 ...

  8. VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法]

    VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] - tingya的专栏 - 博客频道 - CSDN.NET VI ...

  9. ML之prophet:利用prophet算法对维基百科页面的日志每日页面浏览量实现回归预测(时间序列的趋势/周季节性趋势/年季节性趋势)案例

    ML之prophet:利用prophet算法对维基百科页面的日志每日页面浏览量实现回归预测(时间序列的趋势/周季节性趋势/年季节性趋势)案例 目录 利用prophet算法对维基百科页面的日志每日页面浏 ...

最新文章

  1. docker日志位置
  2. 把指定用户的命令写在/home/etc/rc.local中,系统开机时就会自动执行指定用户的命令。
  3. Python爬虫加密
  4. Keras-数据准备
  5. linux 儒略日时间计算,儒略日计算公式的解读
  6. ubuntu如何安装libz库
  7. Edison 物联网:使用MRAA发挥平台输入输出能力
  8. 计算机函数countifs使用,countifs函数的使用方法
  9. 谢烟客---------Linux之命令引入篇
  10. DBCO-PEG4-alcohol CAS:1416711-60-8 二苯基环辛炔-四聚乙二醇-乙醇
  11. Control your destiny, or someone else will
  12. 计算机网络之初识网络
  13. 使用OneNote多人分布式共享
  14. 答题小程序为何那么火?
  15. uniapp实现滑动答题
  16. 拉卡拉支付:以技术为核心驱动金融变革
  17. java入门笔记合集(杂乱)(2)
  18. gdb工具pwndbg与peda与gef
  19. 康拓展开/全排列散列(俞勇板子)
  20. 【JVM 由浅入深】JVM入门

热门文章

  1. PageHelper分页失效问题(通过List流操作和手动分页来解决)
  2. 四、Jetson Xavier Nx内置16G emmc刷机、CUDA、SSD启动
  3. Vue3中computed的使用
  4. 通俗易懂的讲解CPU/GPU/TPU/NPU/XPU/…
  5. linux如何卸载lftp,linux lftp命令 详解
  6. 汉诺塔原理超详细讲解+变式例题
  7. 新浪微博在美递交IPO文件
  8. 输入生日,计算到目前为止的天数,以及活到10000天的日期
  9. 吸顶灯怎么固定天花板_天花板吸顶灯如何进行安装? 安装中的注意事项有哪些?...
  10. 我的Android成长之路(9)----黑科技dataBinding(二)