转自: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. 荧光皮肤有哪些_荧光增白剂真的致癌吗?
  2. nuxt 过滤 query 参数
  3. [转]PowerDesigner使用教程 —— 概念数据模型
  4. 原来带有python又装了一个anaconda有影响吗_anaconda python环境与原有python环境的坑...
  5. Vue006_事件处理
  6. ie浏览器跳转谷歌浏览器_微软IE浏览器的命运:加速死亡
  7. 如何有效开展小组教学_高效课堂 有效教学 | 教育部专家到徐州市第三中学开展教研活动...
  8. 消息中间件原理及JMS简介之二
  9. 压缩文件后,每次的HASH值(MD5)都不相同的原因
  10. Nginx基础详细讲解
  11. kylin基础概念和基础性能优化
  12. 省心!2021精选APP macOS装机必备清单来了
  13. (笔记)数据结构——顺序表
  14. 陈小龙linux及服务器正文 配置rewrite
  15. 【Altium Designer】PCB的泪滴化
  16. Android 实现 拍照测距 的APP
  17. 推荐一款好用的固定资产管理系统
  18. bzoj2708木偶(dp)
  19. Celestial Altium Library
  20. Android系统定时开关机实现简述

热门文章

  1. 禁止手机端点击input框跳出输入法
  2. java开发环境搭建与配置
  3. python判断一个对象是否为空_python 判断对象是否为空
  4. 异步调用Web服务方法
  5. php关联数组转json字符串,php数组转json字符串
  6. Firefox火狐浏览器解决有软件正在阻止 Firefox 安全地连接至此网站问题
  7. php试卷A高质量含答案,php试卷A高质量含答案.doc
  8. Python试卷自动生成器
  9. 计算机管理id7042,【发布】所有机体的ID、代码编号、机体名称(文字版)
  10. JS面试(四):对调变量的六种方法