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

2021-10-09 14:28:38 字數 1338 閱讀 2653

fifo(first in first out)

這裡使用之前實現了的雙向鍊錶來實現fifo演算法。

fifo演算法還是比較好理解的,如果記憶體滿了,則最先淘汰先進入的。

直接上**:

from doublelinkedlist import doublelinkedlist, node

class

fifocache

:def

__init__

(self, capacity)

: self.capacity = capacity

self.size =

0 self.

map=

self.

list

= doublelinkedlist(self.capacity)

defget

(self, key)

:if key not

in self.

map:

return-1

else

: node = self.

map.get(key)

return node.value

defput(self, key, value)

:if self.capacity ==0:

return

if key in self.

map:

node = self.

map.get(key)

self.

list

.remove(node)

node.value = value

self.

list

else

:if self.size == self.capacity:

node = self.

list

.pop(

)del self.

map[node.key]

self.size -=

1 node = node(key, value)

self.

list

self.

map[key]

= node

self.size +=

1

get方法邏輯很簡單,如果快取中沒有這個key則說明資料不在快取中,直接返回-1,有的話直接根據key值返回對應的node的value值即可。

put方法就是需要注意快取滿與未滿的狀態邏輯,在快取滿的時候,除了把node給pop出來以外,還需要把map中相應的key給delete掉。

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

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

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

這一篇是使用雙向鍊錶實現第三個記憶體置換演算法 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 ...