LRU的雙鏈表的簡單實現(小白寫法)

2021-10-04 20:02:18 字數 2143 閱讀 4187

先給乙個節點類,屬性有:節點值(我用的int型別數值為例),前節點,後節點。前節點主要功能是便於不用遍歷的方式尋找前節點,以免多次遍歷造成時間複雜度的增長。

public

class

node

提供乙個構造方法,去建立煉表頭

public

node

(int value)

提供兩種add方式,方便不同的情況插入

public node add

(int value)

//對於直接插入節點,要注意前後節點的更改

public node add

(node node)

重寫tostring方法,方便檢視節點值

@override

public string tostring()

return value+

"-->"

+this

.next.

tostring()

;}

開始寫lru(最大快取區為100)

class

lru//尋找尾節點的方法,從已有尾節點開始往後尋找

void

lastnode()

lastnode= node;

}//檢查值為value的節點值是否存在

node valuecheck

(int value)

x = x.next;

}while

(x != null)

;return null;

}//新增操作,

//遍歷鍊錶,判斷待新增的資料時候已經存在

//存在: 刪除該節點,然後在頭節點新增。

//不存在:

// 1. 快取沒滿:在頭節點新增

// 2. 快取滿了,刪除最後乙個節點,然後在頭節點新增

void

add(

int value)

else

//判斷是否超出快取大小

if(size >= sizemax)

//因為是頭節點新增所以是valuecheck新增node,再將valuecheck賦值給node,

//並將頭節點的前節點置為null

valuecheck.

add(

this

.node)

;this

.node = valuecheck;

this

.node.pre = null;

//最後將size+1

this

.size++;}

//刪除節點,因為該方法是類體自己呼叫的,所以不需要判斷是否存在(因為只有存在才呼叫)

private

void

delete

(node node)

if(node.pre == null)

else

if(node.next == null)

//如果是中間節點的話,就正常斷前後鏈

//刪除某個節點值為value的節點

void

delete

(int value)

//存在的的話就刪除

delete

(valuecheck);}

//尋找某個節點值為value的節點

void

find

(int value)

}//重寫tostring方法,直接用node寫好的tostring就可以

@override

public string tostring()

}

基本基於雙鏈表的lru就是實現了,主要就是對lru的認識,lru就是把最近用的放到最前面,最不常用的放在最後,等到因為快取慢需要刪除的時候,優先刪除最後乙個節點。

雙鏈表實現LRU

題目 lru 快取機制 設計和實現乙個 lru 最近最少使用 快取資料結構,使它應該支援一下操作 get 和 put。get key 如果 key 存在於快取中,則獲取 key 的 value 總是正數 否則返回 1。put key,value 如果 key 不存在,請設定或插入 value。當快取...

基於雙鏈表 hashtable實現的LRU演算法

實現原理 將cache的所有位置都用雙連表連線起來,當乙個位置被命中之後,就將通過調整鍊錶的指向,將該位置調整到煉表頭的位置,新加入的cache直接加到煉表頭中。這樣,在多次進行cache操作後,最近被命中的,就會被向煉表頭方向移動,而沒有命中的,而想鍊錶後面移動,鍊錶尾則表示最近最少使用的cach...

雙鏈表的簡單實現

include include include typedef int elemtype using namespace std typedef struct dulnode dulnode,dulinklist 建立帶有頭結點的雙鏈表,順序輸入 void createdulist dl dulin...