面試題 LRU演算法及編碼實現LRU策略快取

2022-08-31 13:24:09 字數 1771 閱讀 3947

lru(least recently used)就是將最近不被訪問的資料給淘汰掉,lru基於一種假設:認為最近使用過的資料將來被使用的概率也大,最近沒有被訪問的資料將來被使用的概率比較低。

lru一般通過鍊錶形式來存放快取資料,新插入或被訪問的資料放在鍊錶頭部,超過一定閾值後,自動淘汰鍊錶尾部的資料。下圖很形象的說明了lru快取淘汰過程。(來自網路)

步驟:1、新插入a, 將a放置在佇列頭部

2、新插入b, 將b放置在佇列頭部, a自動推舉次席。

3、新插入c, 將c放置在佇列頭部, b自動推舉次席。 

4、新插入d, 將d放置在佇列頭部, c自動推舉次席。 

5、新插入e, 將e放置在佇列頭部, d自動推舉次席。 

6、新插入e, 將e放置在佇列頭部, 這時佇列長度大於閾值,自動將尾部資料a給淘汰掉

7、訪問資料c,然後將c重新放置在佇列頭部。

8、新插入e, 將e放置在佇列頭部, 這時佇列長度大於閾值,自動淘汰尾部資料b

/**

* 2018/4/11.

* * 使用鍊錶+hashmap來實現, 這裡沒有考慮併發情況, 所以在**中沒有使用鎖 */

public

class lrucache

}private hashmapcaches;

private

intmaxcapacity;

private

intcurrentcachesize;

/*** 頭結點, 頭結點不參與淘汰,只是作為標識鍊錶中的第乙個節點

*/private

cachenode head;

/*** 尾節點, 尾節點不參與淘汰, 只是作為標識鍊錶中最後乙個節點

*/private

cachenode tail;

public lrucache(int

maxcapacity)

public

void

put(k k, v v)

node = new

cachenode();

node.key =k;

currentcachesize ++;

}node.value =v;

movetofirst(node);

//lru策略, 新插入的元素放置到佇列頭部

caches.put(k, node);

}public

void

movetofirst(cachenode node)

public

void

removelast()

public

object get(k k)

object v =node.value;

movetofirst(node);

return

v; }

public

object remove(k k)

cachenode pre =node.before;

cachenode next =node.after;

pre.after =next;

next.before =pre;

caches.remove(k);

currentcachesize --;

return

node.value;}}

上述**在博主本機測試驗證通過(單執行緒操作下)

經典演算法面試題 LRU快取

設計和構建乙個 最近最少使用 快取,該快取會刪除最近最少使用的專案。快取應該從鍵對映到值 允許你插入和檢索特定鍵對應的值 並在初始化時指定最大容量。當快取被填滿時,它應該刪除最近最少使用的專案。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存...

面試題 16 25 LRU 快取

設計和構建乙個 最近最少使用 快取,該快取會刪除最近最少使用的專案。快取應該從鍵對映到值 允許你插入和檢索特定鍵對應的值 並在初始化時指定最大容量。當快取被填滿時,它應該刪除最近最少使用的專案。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存...

演算法面試題

1 兩個有序的陣列求中位數 時間複雜度o log n m 這個演算法有一定的缺陷,僅做參考 2 如何解決hash衝突 3 調整陣列順序使奇數字於偶數前面 void reorderoddeven int pdata,unsigned int length 4 鍊錶中倒數第k個節點 listnode f...