用雙向鍊錶實現記憶體置換演算法 三

2021-10-09 14:32:46 字數 1183 閱讀 2361

這一篇是用雙向鍊錶實現lru演算法:

演算法思路:

假如我們的快取可以快取4個子塊:

快取中不存在要放入的字塊時,把子塊放在鍊錶的頭部

如果快取中存在相同子塊,則把這一字塊移到鍊錶的頭部。

快取滿了,放入新的字塊時,把尾部的字塊移除。

下面附上**:

class

lrucache

:def

__init__

(self, capacity)

: self.capacity = capacity

self.

map=

self.

list

= doublelinkedlist(self.capacity)

defget

(self, key)

:if key in self.

map:

node = self.

map[key]

self.

list

.remove(node)

self.

list

return node.value

else

:return-1

defput

(self, key, value)

:if key in self.

map:

node = self.

map.get(key)

self.

list

.remove(node)

node.value = value

self.

list

else

: node = node(key, value)

# 鍊錶快取已滿

if self.

list

.size >= self.

list

.capacity:

old_node = self.

list

.remove(

) self.

map.pop(old_node.key)

self.

list

self.

map[key]

= node

用雙向鍊錶實現記憶體置換演算法(二)

fifo first in first out 這裡使用之前實現了的雙向鍊錶來實現fifo演算法。fifo演算法還是比較好理解的,如果記憶體滿了,則最先淘汰先進入的。直接上 from doublelinkedlist import doublelinkedlist,node class fifoca...

用雙向鍊錶實現記憶體置換演算法 四

這一篇是使用雙向鍊錶實現第三個記憶體置換演算法 lfu lfu演算法分析 最不經常使用演算法,在快取滿了的時候,先淘汰使用頻率最少的,這裡我們就需要用乙個變數來記錄資料的使用頻率。但是會有乙個情況,就是使用頻率相同的時候如何去處理,這裡我是採用map來記錄,key為使用的頻率,value是雙向鍊錶,...

用java實現雙向鍊錶

判斷指定索引是否合法 param index return public boolean islinkindex int index 根據指定索引取得具體節點 param index return public node node int index return temp else return ...