最近最少使用算法有兩種實現方式:
(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次。
最近最少使用算法的實現開銷是很大的。