最近最少使用队列算法

定义:

LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的,是根据页面调入内存后的使用情况进行决策了。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU算法就是将最近最久未使用的页面予以淘汰。

可以用一个特殊的栈来保存当前正在使用的各个页面的页面号。当一个新的进程访问某页面时,便将该页面号压入栈顶,其他的页面号往栈底移,如果内存不够,则将栈底的页面号移除。这样,栈顶始终是最新被访问的页面的编号,而栈底则是最近最久未访问的页面的页面号。

 

实现代码:

  1 import java.util.HashSet;
  2 import java.util.Set;
  3 
  4 public class LRU2<E> {
  5     
  6     private Node<E> head;
  7     
  8     private Node<E> tail;
  9 
 10     private int maxcapacity = 3;
 11     
 12     private int count = 0;
 13     
 14     private final Set<E> valueSet = new HashSet<E>();
 15     
 16     LRU2(int maxcapacity){
 17         this.maxcapacity = maxcapacity;
 18     }
 19     
 20     LRU2(){
 21     }
 22     
 23     public boolean add(E e) {
 24         Node newNode = new Node(e);
 25         if(count == 0) {
 26             this.head = newNode;
 27             this.tail = newNode;
 28             valueSet.add(e);
 29             count++;
 30             return true;
 31         }
 32         
 33         if(valueSet.contains(e)) {
 34             if(count == 1) {
 35                 return false;
 36             }else if(e == head.value) {
 37                 head.next.before = null;
 38                 head = head.next;
 39                 tail.next = newNode;
 40                 newNode.before = tail;
 41                 tail = newNode;
 42                 return false;
 43             }else if( e == tail.value) {
 44                 return false;
 45             }else {
 46                 Node temp = head.next;
 47                 while(temp != null) {
 48                     if(e == temp.value) {
 49                         Node b = temp.before;
 50                         b.next = temp.next;
 51                         temp.next.before = temp.before;
 52                         temp.next = null;
 53                         tail.next = temp;
 54                         temp.before = tail;
 55                         tail = temp;
 56                         return false;
 57                     }else {
 58                         temp = temp.next;
 59                     }
 60                 }
 61             }
 62         }else {
 63             tail.next = newNode;
 64             newNode.before = tail;
 65             tail = newNode;
 66             count++;
 67             valueSet.add(e);
 68             if(count > maxcapacity) {
 69                 E v = head.value;
 70                 Node h = head.next;
 71                 h.before = null;
 72                 head = h;
 73                 count--;
 74                 valueSet.remove(v);
 75             }
 76             return true;
 77         }
 78         
 79         return false;
 80     }
 81     
 82     class Node<E> {
 83         Node<E> before ;
 84         Node<E> next ;
 85         E value;
 86         
 87         Node(E e){
 88             this.value = e;
 89         }
 90         
 91     }
 92 
 93     
 94     public void printNodes() {
 95         Node temp = head;
 96         while(null != temp) {
 97             System.out.print(temp.value + " ");
 98             temp = temp.next;
 99         }
100         System.out.println();
101     }
102     
103     
104     public static void main(String[] args) {
105         LRU2<Integer> l = new LRU2<Integer>(4);
106         l.add(1);
107         l.printNodes();
108         l.add(2);
109         l.printNodes();
110         l.add(3);
111         l.printNodes();
112         l.add(3);
113         l.printNodes();
114         l.add(4);
115         l.printNodes();
116         l.add(3);
117         l.printNodes();
118         l.add(5);
119         l.printNodes();
120     }
121 }

 

posted @ 2018-04-15 17:11  zhangyfr  阅读(802)  评论(0编辑  收藏  举报