LRU最近最少使用算法


  最近最少使用算法有兩種實現方式:

  (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次。

最近最少使用算法的實現開銷是很大的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM