左神演算法筆記(二十) LRU快取演算法實現

2021-10-02 16:21:53 字數 1727 閱讀 7363

準備兩張表,乙個雜湊表,乙個雙向鍊錶。假設a,3存入表中,則map中key還是原始的key,key=a,value加工一下,包括a和3.

對於雙向鍊錶從尾部加,從頭部出。如果需要將某個元素從拿出,則此時將需要拿出的元素拿出,放到鍊錶的最後,此時,該元素優先順序最高。

如果快取大小超過了k,此時將雙向鍊錶的頭結點拿出,取出其中的key,使得原來map中刪除該元素,將新的元素放入map中,同時將元素放到雙向鍊錶的末尾。

由於node給出的是乙個泛型的node引數,所以**中採用了兩個map,如果想用乙個map就實現整個**,就需要將node泛型修改,改為node.

public

static

class

nodedoublelinkedlist

//增加節點

public

void

addnode

(node

newnode)if(

this

.head == null)

else

}//將節點移到結尾的位置

public

void

movenodetotail

(node

node)if(

this

.head == node)

else

node.last =

this

.tail;

node.next = null;

this

.tail.next = node;

this

.tail = node;

}//移除頭節點

public node

removehead()

node

res =

this

.head;

//如果整個鍊錶中只含有乙個元素,移除後頭和尾都要指向空if(

this

.head ==

this

.tail)

else

return res;}}

//node存入map中,存入的是記憶體位址,而不會存入具體的數值,即使node中有很多的文字,也不會有很大影響

public

static

class

mycache

this

.keynodemap =

newhashmap

>()

;this

.nodekeymap =

newhashmap

,k>()

;this

.nodelist =

newnodedoublelinkedlist

();this

.capacity = capacity;

}public v get

(k key)

return null;

}public

void

set(k key,v value)

else}}

private

void

removemostunusedcache()

}

lru設計的思路並不難,主要考察邊界條件的思考和不同操作之間的組合,做好這種題目的唯一方法就是多練codeing能力。

左神演算法筆記(二十一) LFU快取演算法實現

lfu least frequently used 淘汰最近訪問頻率最小的元素。設計思路 兩個雙向鍊錶,橫向的雙向鍊錶用來統計訪問頻率,縱向的雙向鍊錶,沒出現過的元素出現在橫向鍊錶的頭結點上,如果一直增加沒有訪問,則將元素全部掛到頭結點的下方,縱向形成雙向鍊錶。橫向鍊錶中統計訪問的頻率,如果增加某個...

左神演算法筆記01

對數器異或工具 一些其它的位運算子的操作 簡單理解為 將乙個演算法的所有操作拆成基本操作 常數時間完成的操作 後,計算出操作次數和操作時間 可視為1 的乘積,即操作次數之和。在考慮最差情況時用o 來表示時間複雜度,取最高項來表示。如o n o logn 對n個數進行排列,則最差要進行1 2 3 n ...

左神演算法筆記03

可以是函式遞迴,也可以是迴圈實現。將大的陣列對半分為兩個陣列,每個陣列排好序後再合併為大的陣列。如果使用迴圈實現,要提防整形溢位 應用 最小和問題,若陣列的左邊的乙個數比右邊的某乙個數小,在返回結果加上自身的大小 public static intprocess int arr,int l,int ...