準備兩張表,乙個雜湊表,乙個雙向鍊錶。假設a,3存入表中,則map中key還是原始的key,key=a,value加工一下,包括a和3.
對於雙向鍊錶從尾部加,從頭部出。如果需要將某個元素從拿出,則此時將需要拿出的元素拿出,放到鍊錶的最後,此時,該元素優先順序最高。
如果快取大小超過了k,此時將雙向鍊錶的頭結點拿出,取出其中的key,使得原來map中刪除該元素,將新的元素放入map中,同時將元素放到雙向鍊錶的末尾。
由於node給出的是乙個泛型的node引數,所以**中採用了兩個map,如果想用乙個map就實現整個**,就需要將node泛型修改,改為node.
lru設計的思路並不難,主要考察邊界條件的思考和不同操作之間的組合,做好這種題目的唯一方法就是多練codeing能力。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()
}
左神演算法筆記(二十一) 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 ...