最近最少使用算法有两种实现方式:

  (1)记时法:对于每一页增设一个访问时间计时器。每当一个页面被访问时,当时的绝对时钟内容被复制到对应的访问时间计时器中。这样系统就记录了内存中所有页面最后一次被访问的时间。淘汰时,选取访问时间计时器值中最小者对应的页面。

import java.util.Date;

// IMPORT LIBRARY PACKAGES NEEDED BY YOUR PROGRAM
// SOME CLASSES WITHIN A PACKAGE MAY BE RESTRICTED
// DEFINE ANY CLASS AND METHOD NEEDED
// CLASS BEGINS, THIS CLASS IS REQUIRED
public class LeastRecentPage
{
// METHOD SIGNATURE BEGINS, THIS METHOD IS REQUIRED
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] pages = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0};//结果是11;
System.out.println(lruCountMiss(3, pages));
}
public static int lruCountMiss(int max_cache_size, int[] pages)
{
// INSERT YOUR CODE HERE
int[] cache = new int[max_cache_size];
int TIME = 1;
int[] time=new int[max_cache_size];
int index=-1;
int miss=0;
L: for(int k=0;k<pages.length;k++){
int min = Integer.MAX_VALUE;
int min_index=0;
for(int i=0;i<max_cache_size;i++){
index = (index+1)%max_cache_size;
if(time[index]==0){
cache[index]=pages[k];
time[index]= TIME++;
miss++;
continue L;
}
if(cache[index]==pages[k]){
time[index] = TIME++;
continue L;
}
if(time[index]<min){
min = time[index];
min_index = index;
}
}
miss++;
cache[min_index]=pages[k];
time[min_index]= TIME++;
index=min_index;
}
return miss;
}
// METHOD SIGNATURE ENDS
}

  (2)栈法:按照页面最后一次访问的时间次序将页面号依次排列到栈中。当一个页面最访问时,其对应的页面号由站内取出送入栈顶。淘汰时,取栈底页面号所对应的页面。这里的栈不是通常定义的先入先出栈。为了便于对栈中任意位置的操作,应用双向链表来构造栈。

import java.util.LinkedList;
import java.util.List; // IMPORT LIBRARY PACKAGES NEEDED BY YOUR PROGRAM
// SOME CLASSES WITHIN A PACKAGE MAY BE RESTRICTED
// DEFINE ANY CLASS AND METHOD NEEDED
// CLASS BEGINS, THIS CLASS IS REQUIRED
public class LeastRecentPage
{
// METHOD SIGNATURE BEGINS, THIS METHOD IS REQUIRED
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] pages = {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0};//结果是11;
System.out.println(LinkedListlruCountMiss(3, pages));
}
public static int LinkedListlruCountMiss(int max_cache_size, int[] pages)
{
// INSERT YOUR CODE HERE
int[] cache = new int[max_cache_size];
List<Integer> li = new LinkedList<Integer>();
int index=-1;
int miss=0;
L: for(int k=0;k<pages.length;k++){
for(int i=0;i<max_cache_size;i++){
index = (index+1)%max_cache_size;
if(cache[index]==pages[k]){
li.remove(new Integer(index));
li.add(new Integer(index));
continue L;
}
}
miss++;
if(cache[index]==0){
li.add(index);
continue L;
}
index = li.remove(li.size()-1);
li.add(new Integer(index));
cache[index] = pages[k];
}
return miss;
}
// METHOD SIGNATURE ENDS
}

运行结果都是:11次。

最近最少使用算法的实现开销是很大的。

LRU最近最少使用算法的更多相关文章

  1. 数据库存取缓冲区的LRU与MRU算法

    数据库存取缓冲区的LRU与MRU算法 1.Cache Hit and Cache Miss 当使用者第一次向数据库发出查询数据的请求的时候,数据库会先在缓冲区中查找该数据,如果要访问的数据恰好已经在缓 ...

  2. LRU与MRU算法

    1.Cache Hit and Cache Miss 当使用者第一次向数据库发出查询数据的请求的时候,数据库会先在缓冲区中查找该数据,如果要访问的数据恰好已经在缓冲区中(我们称之为Cache Hit) ...

  3. 最近最少使用算法(LRU)——页面置换

    原创 上一篇博客写了先进先出算法(FIFO)——页面置换:http://www.cnblogs.com/chiweiming/p/9058438.html 此篇介绍最近最少使用算法(LRU)——页面置 ...

  4. LeetCode之LRU Cache 最近最少使用算法 缓存设计

    设计并实现最近最久未使用(Least Recently Used)缓存. 题目描述: Design and implement a data structure for Least Recently ...

  5. Java--缓存热点数据,最近最少使用算法

    1.最近最少使用算法LRU (Least recently used,最近最少使用) [实现]:最常见的是使用一个链表保存缓存数据 1.新数据插入到链表头部: 2.每当缓存命中(即缓存数据被访问),将 ...

  6. 04 | 链表(上):如何实现LRU缓存淘汰算法?

    今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是+LRU+缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...

  7. 数据结构与算法之美 06 | 链表(上)-如何实现LRU缓存淘汰算法

    常见的缓存淘汰策略: 先进先出 FIFO 最少使用LFU(Least Frequently Used) 最近最少使用 LRU(Least Recently Used) 链表定义: 链表也是线性表的一种 ...

  8. 链表:如何实现LRU缓存淘汰算法?

    缓存淘汰策略: FIFO:先入先出策略 LFU:最少使用策略 LRU:最近最少使用策略   链表的数据结构: 可以看到,数组需要连续的内存空间,当内存空间充足但不连续时,也会申请失败触发GC,链表则可 ...

  9. 《数据结构与算法之美》 <04>链表(上):如何实现LRU缓存淘汰算法?

    今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是 LRU 缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...

随机推荐

  1. python3 第九章 - 数据类型之Number(数字)

    Python 支持三种不同的数字类型: 整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点.Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 ...

  2. float是什么样式?

    什么是float样式? 让标签浮动起来,总体方向往上 right,left(右浮,左浮) 联合height,width使用,分别占用y方向和x方向多少,单位px或百分比(%) 作用对象不是页面,而是作 ...

  3. scrapy_ItemLoader

    什么是Itemloader? 一种容器,实现直白高效字段提取 直接赋值取值的方式,会出现一下几个问题 代码量一多,各种css和xpath选择器,充斥整个代码逻辑,没有规则,不利于维护 对于一个字段的预 ...

  4. js 数组与对象的区别

    学习javascript的时候,我曾经一度搞不清楚”数组”(array)和”对象”(object)的根本区别在哪里,两者都可以用来表示数据的集合.   比如有一个数组a=[1,2,3,4],还有一个对 ...

  5. Python之数学(math)和随机数(random)

    math包包含了最基本的数学运算函数,如果想要更加高级的数学功能,可以使用标准库外的numpy和scipy库,他们不但支持数组和矩阵运算, 还有丰富的数学和物理方程可供使用 random包可以用来生成 ...

  6. IE下常见的js兼容问题

    1.IE下不支持console.log() 2.IE下不支持addEventListener() 解决办法:用IE相应的attachEvent() 3.IE下请求后台接口会有缓存 解决方案,接口加版本 ...

  7. Codeforce C. Bus

    C. Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output ...

  8. Java中的最值

    Double.MAX_VALUE     等于 (2-2^(-52)) * 2^1023 约等于2^1024Double.MIN_VALUE      最小正非零值 2^(-1074)Long.MAX ...

  9. [DeeplearningAI笔记]改善深层神经网络1.4_1.8深度学习实用层面_正则化Regularization与改善过拟合

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.4 正则化(regularization) 如果你的神经网络出现了过拟合(训练集与验证集得到的结果方差较大),最先想到的方法就是正则化(re ...

  10. Python学习笔记(一):列表和元组

    1.列表和元组的主要区别在于:列表可以修改,元组则不能.即如果要根据要求添加元素,列表更适合,    如果出于某种原因,序列不能修改的时候,使用元组更为合适. 2.通用序列操作1)索引:正数索引时,p ...