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

2021-10-09 14:34:50 字數 2090 閱讀 8137

這一篇是使用雙向鍊錶實現第三個記憶體置換演算法----lfu

lfu演算法分析:

最不經常使用演算法,在快取滿了的時候,先淘汰使用頻率最少的,這裡我們就需要用乙個變數來記錄資料的使用頻率。但是會有乙個情況,就是使用頻率相同的時候如何去處理,這裡我是採用map來記錄,key為使用的頻率,value是雙向鍊錶,當快取滿了的時候,找到最低頻率的value,根據fifo的規則去淘汰。

class

lfunode

(node)

:def

__init__

(self, key, value)

: self.freq =

0super

(lfunode, self)

.__init__(key, value)

這裡直接附上**,在結尾會對一些細節進行解釋:

class

lfucache

:def

__init__

(self, capacity)

: self.capacity = capacity

self.

map=

# key: 頻率, value: 頻率對應的雙向鍊錶

self.freq_map =

self.size =

0# 更新節點頻率的操作

def__update_freq

(self, node)

: freq = node.freq

# 刪除

node = self.freq_map[freq]

.remove(node)

if self.freq_map[freq]

.size ==0:

del self.freq_map[freq]

# 更新

freq +=

1 node.freq = freq

if freq not

in self.freq_map:

self.freq_map[freq]

= doublelinkedlist(

) self.freq_map[freq]

defget

(self, key)

:if key not

in self.

map:

return-1

node = self.

map.get(key)

self.__update_freq(node)

return node.value

defput(self, key, value)

:if self.capacity ==0:

return

# 快取命中

if key in self.

map:

node = self.

map.get(key)

node.value = value

self.__update_freq(node)

# 快取未命中

else

:if self.capacity == self.size:

# 最低頻率

min_freq =

min(self.freq_map)

node = self.freq_map[min_freq]

.pop(

)del self.

map[node.key]

self.size -=

1 node = lfunode(key, value)

node.freq =

1 self.

map[key]

= node

if node.freq not

in self.freq_map:

self.freq_map[node.freq]

= doublelinkedlist(

) self.freq_map[node.freq]

self.size +=

1

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

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

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

這一篇是用雙向鍊錶實現lru演算法 演算法思路 假如我們的快取可以快取4個子塊 快取中不存在要放入的字塊時,把子塊放在鍊錶的頭部 如果快取中存在相同子塊,則把這一字塊移到鍊錶的頭部。快取滿了,放入新的字塊時,把尾部的字塊移除。下面附上 class lrucache def init self,cap...

用java實現雙向鍊錶

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