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

2021-06-27 04:07:15 字數 1460 閱讀 6705

實現原理: 將cache的所有位置都用雙連表連線起來,當乙個位置被命中之後,就將通過調整鍊錶的指向,將該位置調整到煉表頭的位置,新加入的cache直接加到煉表頭中。

這樣,在多次進行cache操作後,最近被命中的,就會被向煉表頭方向移動,而沒有命中的,而想鍊錶後面移動,鍊錶尾則表示最近最少使用的cache。

當需要替換內容時候,鍊錶的最後位置就是最少被命中的位置,我們只需要淘汰鍊錶最後的部分即可。

public class lrucache 

} public lrucache(int i)

/*** 獲取快取中物件

* @param key

* @return

*/public object get(object key) else }

/*** 新增快取

* @param key

* @param value

*/public void put(object key, object value) else

node = new cachenode();

} node.value = value;

node.key = key;

//將最新使用的節點放到煉表頭,表示最新使用的.

movetohead(node);

nodes.put(key, node);

} /**

* 將快取刪除

* @param key

* @return

*/public object remove(object key)

if (node.next != null)

if (last == node)

last = node.prev;

if (first == node)

first = node.next;

} return node;

} public void clear()

/*** 刪除鍊錶尾部節點

* 表示 刪除最少使用的快取物件

*/private void removelast() }

/*** 移動到煉表頭,表示這個節點是最新使用過的

* @param node

*/private void movetohead(cachenode node)

first = node;

node.prev = null;

if (last == null)

last = first;

} private int cachesize;

private hashtable nodes;//快取容器

private int currentsize;

private cachenode first;//煉表頭

private cachenode last;//鍊錶尾

}

單鏈表 雙鏈表

實現乙個單鏈表,鍊錶初始為空,支援三種操作 1 向煉表頭插入乙個數 2 刪除第k個插入的數後面的數 3 在第k個插入的數後插入乙個數 現在要對該鍊錶進行m次操作,進行完所有操作後,從頭到尾輸出整個鍊錶。注意 題目中第k個插入的數並不是指當前鍊錶的第k個數。例如操作過程中一共插入了n個數,則按照插入的...

單鏈表和雙鏈表

單鏈表 單鏈表只有乙個指向下一結點的指標,也就是只能next 雙鏈表 雙鏈表除了有乙個指向下一結點的指標外,還有乙個指向前一結點的指標,可以通過prev 快速找到前一結點,顧名思義,單鏈表只能單向讀取 為什麼市場上單鏈表的使用多餘雙鏈表呢?從儲存結構來看,每個雙鏈表的節點要比單鏈表的節點多乙個指標,...

單鏈表和雙鏈表

單鏈表 是乙個node,儲存當前物件,並指向下乙個next,插入在第一位node,next指向原來的first 單鏈表 只儲存第乙個node的引用,雙端鍊錶 儲存兩個node的引用,第乙個和最後乙個node,可以從第乙個插入,也可以從最後乙個插入,也可以從頭部和尾部刪除 鏈結點,相當於是車廂 pub...