华为机试---LRU算法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bigthinker/article/details/51878464


最近最少使用算法,如果缓存不够,LRU算法就是将最近最久未使用的页面淘汰,并计算最终的缺页次数
public static int count(int size , int[] data){
    int count = 0;
    return count;
}
size缓存区大小,保存的最大页面数
data数组按顺序向缓存发送页面请求
(1)需要判断缓冲区是否已经到最大值
(2)统计缓冲区中每个页面的访问频率
(3)缓冲区满的时候,替换出访问频率最小的

输入序列 4,7,0,7,1,0,1,2,1,2,6


public class Main{
 private static int current_size = 0;//保存当前缓冲区的大小
 private static int[] buffer;//定义缓冲区保存页面
 private static int lack_page_num = 0;//保存缺页次数
 public static void main(String[] args){
  int[] data = {4,7,0,7,1,0,1,2,1,2,6};//页面请求
  int buffer_size = 5;//缓存区最大容量
  LRU(buffer_size , data);
  System.out.println(lack_page_num);
 }
 /**
  * LRU算法实现:
  * 定义:LRU是LeastRecentlyUsed近期最少使用算法。内存管理的一种页面置换算法。
  *     对于在内存中但又不用的数据块(内存块)叫做LRU。
  * 算法思想:淘汰最长没有使用的页
  * @param size 缓存区最大容量
  * @param data 页面请求
  * */
 private static void LRU(int size , int[] data){
  int length = data.length;
  buffer = new int[size];//定义缓冲区保存页面
  for(int i = 0 ; i < length ; i++){   
   //判断页面是否在缓冲区存在,如果存在先删除后面再插入
   deleteSamePageInBuffer(data[i]);
   //判断缓冲区当前页面的大小是否超过限制
   //1.没有超过,直接插入
   if(current_size < size){
    buffer[current_size] = data[i];
    current_size++;
   }else{
      //2.等于size,需要先删除buffer[0],然后再插入
    for(int j = 0 ; j < size - 1 ; j++){
     buffer[j] = buffer[j + 1];
    }
    buffer[size - 1] = data[i];
   }   
  }
 }
 /**
  * 判断缓冲区中是否存在某个元素,如果存在,先删除然后重新插入
  * 保证缓冲区数组的元素0~length-1是按照近期使用情况的顺序从  最久未使用~最近使用
  * */
 private static void deleteSamePageInBuffer(int key){
  boolean isExist = false;
  for(int i = 0 ; i < current_size ; i++){
   //如果存在,删除
   if(key == buffer[i]){
    isExist = true;
    for(int j = i ; j < current_size - 1 ; j++){
     buffer[j] = buffer[j + 1];
    }
    current_size--;//删除掉一个元素更新当前缓冲区的页面个数
    return;
   }
  } 
  //如果缓冲区不存在当前页面编号,更新缺页次数
  if(!isExist){
   lack_page_num++;
  }
 } 
}

展开阅读全文

没有更多推荐了,返回首页