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

  (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. Redis集群方案怎么做?大牛给你介绍五种方案!

    Redis集群方案 Redis数据量日益增大,而且使用的公司越来越多,不仅用于做缓存,同时趋向于存储这块,这样必促使集群的发展,各个公司也在收集适合自己的集群方案,目前行业用的比较多的是下面几种集群架 ...

  2. 关于手残,搞废我的OLED屏幕的 追悼会

    2017-12-1913:36:41 昨天按照B站的资料利用esp12F做了一个天气站,可预报天气,惭愧的是模型做好了,照片还没拍就夭折了,可怜了我20块的屏幕,我心伤悲,莫知我哀呀! 本来调试已经成 ...

  3. CSS深入理解学习笔记之vertical-align

    1.vertical-align基本认识 支持的属性值: ①线类:baseline(默认),top,middle,bottom ②文本类:text-top,text-bottom ③上标下标类:sub ...

  4. JQuery判断是否为空

    //有如下三种判断 var A=$("#**).val(); if(A==null||A!=undefined||A==""){ //处理 } //参考文章1说下面方法效 ...

  5. STL map简单使用

    #include <map> #include <iostream> //pair使用头文件iostream using namespace std; int main() { ...

  6. Mysql Innodb 锁机制

    latch与lock latch 可以认为是应用程序中的锁,可以称为闩锁(轻量级的锁) 因为其要求锁定的时间必须要非常短,若持续时间长,则会导致应用性能非常差,在InnoDB存储引擎中,latch又可 ...

  7. poj 1423 打表/斯特林公式

    对于n位数的计算,我们可以采用(int)log10(n) + 1的方法得到n的位数 第一种方法: 对于n!位数的计算,log10(n!) = log10(1) + log10(2) + ... + l ...

  8. 安装pcntl以实现php多进程

    pcntl 扩展包一般就在php源码的ext目录下. cd ./ext/pcntl /opt/server/php5/bin/phpize ./configure \ --with-php-confi ...

  9. 使用zii.widgets.CDetailView显示内容

    Yii里的CDetailView可以用来显示详细内容,有时会遇到显示的html内容是被转义过的,也就是原本是要显示html样式的,结果显示出来的内容却是把html当作普通文本了. 先看一个CDetai ...

  10. snowflake分布式唯一id c#实现

    snowflake算法 snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID.其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心, ...