1. 程式人生 > 實用技巧 >用JAVA實現一個簡單LRU演算法

用JAVA實現一個簡單LRU演算法

一個LRU演算法最簡單的有如下的功能:這裡我們先不考慮用雜湊表做優化

實際上就是一個連結串列,通過連結串列來模擬實現

public class Linked {
// 用連結串列實現一個LRU快取 (大小為100),要求實現新增一個數據的方法。(自己定義節點類,儲存的資料型別為int)。
public static void main(String args[]){
ListLRU lru = new ListLRU(6);
lru.addNode(5);
lru.addNode(4);
lru.addNode(3);
lru.addNode(2);
lru.addNode(1);
lru.printLRU();
lru.addNode(6);
lru.printLRU();
lru.addNode(3);
lru.printLRU();
lru.addNode(7);
lru.printLRU();
}
}
public class ListLRU { //帶頭結點的單鏈表,根據題意,所有結點值不同
static int lenLimit;
static Node headNode = new Node(-1);//結點值-1表示這是頭結點
public ListLRU(int lenLimit){
this.lenLimit = lenLimit;
}

static public int length(){
int length = 0;
Node scan = headNode;
while(scan.next!=null){
scan=scan.next;
length++;

}
return length;
}

//新增的邏輯:
public void addNode(int value){
Node newone = new Node(value);//先建立一個待加入的新結點
Node p = headNode;

while(p.value != newone.value&&p.next!=null){
p=p.next;
}
//出迴圈兩種可能,遍歷結束沒有找到,或者是找到了
if(p.next == null){//遍歷完了沒有找到
int len=ListLRU.length();
if(len<lenLimit){ //不需要刪除,直接在頭部新增
newone.next = headNode.next;
headNode.next = newone ;

}else{

//先刪除最後一個結點
deleteNode(p.value);
//再在列表頭部新增
newone.next = headNode.next;
headNode.next = newone;
}
}else{ //找到了這個結點,刪除,在頭部新增
deleteNode(p.value);
newone.next = headNode.next;
headNode.next = newone;
}

}


public boolean deleteNode(int value){
Node p = headNode;
Node pre = null;
while(p.value!=value&&p.next!=null){
pre = p;
p = p.next;
}
//跳出迴圈有兩種可能:找到要刪除的結點了,或者到達末尾了
if(p.value == value){ //說明是找到了
pre.next = p.next;
return true;

}else{ //到了末尾還沒有,返回異常
return false;
}
}
public void printLRU(){
Node p = headNode;
if(p.next == null) System.out.println("LRU連結串列當前無結點");
while(p.next!= null){
p = p.next;
System.out.print(p.value+" ");
}
System.out.println();
}
}
public class Node {
int value=-1;
Node next=null;
public Node(int value,Node next){
this.value = value;
this.next = next;
}
public Node(int value){
this.value = value;
}
}