Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229655
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 407
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-27 13:42
文章分类

全部博文(41)

文章存档

2016年(1)

2015年(18)

2014年(22)

我的朋友

分类: Java

2014-11-03 20:17:51

    LRU是近期最少使用的替换算法。其中有两个关键点,一个是近期,另外一个最少使用,也就是说最新更新的数据,生命值最高。在实现模拟算法的时候,可以设置一个成员变量记录访问的次数,每次访问或者设置都会加1,并把这个值设置为每个内存块的生命值,这样最新访问的内存块就不会被替换掉了。模拟的数据结构中,不会有一次访问中访问多个内存块的情况,其实也就只是根据访问的先后来进行替换。如果每次可以访问多个内存块,那么就需要统计每个内存块的访问次数。


public class LRUCache {
 // mem is a [capacity][3]
 // [][0]:store the value
 // [][1]:store the max;
 // [][2]:store the key;
 private int [][]mem;
 private int    capacity;
 private int max = 0, count = 0;
 public LRUCache(int capacity) {
        mem = new int[capacity][3];
        this.capacity = capacity;
        for (int i = 0; i < capacity; i++) {
         mem[i][0] = 0;
         mem[i][1] = 0;
         mem[i][2] = -1;
        }
    }
    ///////////////////////////////////////////////////////////////////get
    public int get(int key) {
     max++;
     int i = 0;
     for ( i = 0; i < capacity; i++) {
      if (mem[i][2] == key) {
       mem[i][1] = max;
       return mem[i][0];
      }
     }
     return -1;
    }
    ///////////////////////////////////////////////////////////////////////  set
    public void set(int key, int value) {
        max++;
        int i = 0, index = 0, min = max;
        for ( i = 0; i < capacity; i++) {
      if (mem[i][2] == key) {
       mem[i][0] = value;
       mem[i][1] = max;
       return;
      }
     }
        if (count < capacity)
         for (i = 0; i < capacity; i++) {
          if (mem[i][2] == -1) {
           index = i;
           break;
          }
         }
        else
      for (i = 0; i < capacity; i++)
       if (mem[i][1] < min) {
        min = mem[i][1];
        index = i;
       }
        mem[index][0] = value;
     mem[index][1] = max;
     mem[index][2] = key;
        count++;
    }
}
阅读(1403) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~