Python實(shí)現(xiàn)FIFO緩存置換算法
本文實(shí)例為大家分享了Python實(shí)現(xiàn)FIFO緩存置換算法的具體代碼,供大家參考,具體內(nèi)容如下
在上一節(jié)中我們實(shí)現(xiàn)了雙向鏈表DoubleLinkedList類(lèi),本節(jié)我們基于雙向鏈表實(shí)現(xiàn)FIFO(先進(jìn)先出)緩存置換算法。
一、FIFO實(shí)現(xiàn)
代碼邏輯很簡(jiǎn)單,就是遵循先進(jìn)先出的原則,具體流程都寫(xiě)在注釋中了。通過(guò)一個(gè)map來(lái)實(shí)現(xiàn)查找時(shí)的O(1)復(fù)雜度
class FIFOCache(object): ? ? def __init__(self, capacity=0xffffffff): ? ? ? ? """ ? ? ? ? FIFO緩存置換算法 ? ? ? ? :param capacity: ? ? ? ? """ ? ? ? ? self.capacity = capacity ? ? ? ? self.map = {} ? ? ? ? self.size = 0 ? ? ? ? self.list = DoubleLinkedList(capacity) ? ? def get(self, key): ? ? ? ? """ ? ? ? ? 獲取元素 ? ? ? ? ? ? 不存在 返回None ? ? ? ? ? ? 已存在 則返回緩存值 ? ? ? ? :param key: ? ? ? ? :return: ? ? ? ? """ ? ? ? ? # 當(dāng)前緩存中不存在 ? ? ? ? if key not in self.map: ? ? ? ? ? ? return None ? ? ? ? # 當(dāng)前緩存中存在 ? ? ? ? node = self.map.get(key) ? ? ? ? return node.value ? ? def put(self, key, value): ? ? ? ? """ ? ? ? ? 添加元素 ? ? ? ? ? ? 已存在 更新值并添加至鏈表尾部 ? ? ? ? ? ? 不存在 判斷緩存容量大小后添加 ? ? ? ? :param key: ? ? ? ? :param value: ? ? ? ? :return: 已添加的節(jié)點(diǎn) ? ? ? ? """ ? ? ? ? # 當(dāng)前緩存中已存在 ? ? ? ? if key in self.map: ? ? ? ? ? ? node = self.map.get(key) ? ? ? ? ? ? self.list.remove(node) ? ? ? ? ? ? node.value = value ? ? ? ? ? ? self.list.append(node) ? ? ? ? else: ? ? ? ? ? ? # 緩存容量達(dá)到上限 刪除頭結(jié)點(diǎn) ? ? ? ? ? ? if self.size >= self.capacity: ? ? ? ? ? ? ? ? old_node = self.list.pop() ? ? ? ? ? ? ? ? del self.map[old_node.key] ? ? ? ? ? ? ? ? self.size -= 1 ? ? ? ? ? ? node = Node(key, value) ? ? ? ? ? ? self.map[key] = node ? ? ? ? ? ? self.list.append(node) ? ? ? ? ? ? self.size += 1 ? ? ? ? return node ? ? def print(self): ? ? ? ? """ ? ? ? ? 打印當(dāng)前鏈表 ? ? ? ? :return: ? ? ? ? """ ? ? ? ? self.list.print() ? ? ? ? # print(self.map)
二、測(cè)試邏輯
if __name__ == '__main__': ? ? fifo_cache = FIFOCache(2) ? ? fifo_cache.put(1, 1) ? ? fifo_cache.print() ? ? fifo_cache.put(2, 2) ? ? fifo_cache.print() ? ? print(fifo_cache.get(2)) ? ? fifo_cache.put(3, 3) ? ? fifo_cache.print() ? ? print(fifo_cache.get(1)) ? ? fifo_cache.put(2, 4) ? ? fifo_cache.print()
測(cè)試結(jié)果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)語(yǔ)音轉(zhuǎn)文本的兩種方法
這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)語(yǔ)音轉(zhuǎn)文本的兩種方法,Python提供了許多工具和庫(kù)來(lái)進(jìn)行這些任務(wù),本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06python中pandas操作apply返回多列的實(shí)現(xiàn)
本文主要介紹了python中pandas操作apply返回多列的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08python+opencv3生成一個(gè)自定義純色圖教程
今天小編就為大家分享一篇python+opencv3生成一個(gè)自定義純色圖教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02python 串行執(zhí)行和并行執(zhí)行實(shí)例
這篇文章主要介紹了python 串行執(zhí)行和并行執(zhí)行實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python+requests+unittest執(zhí)行接口自動(dòng)化測(cè)試詳情
這篇文章主要介紹了Python+requests+unittest執(zhí)行接口自動(dòng)化測(cè)試詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09Python實(shí)現(xiàn)批量采集商品數(shù)據(jù)的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)批量采集商品的數(shù)據(jù),文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Django項(xiàng)目如何給數(shù)據(jù)庫(kù)添加約束
這篇文章主要介紹了Django項(xiàng)目如何給數(shù)據(jù)庫(kù)添加約束,幫助大家更好的理解和學(xué)習(xí)使用Django框架,感興趣的朋友可以了解下2021-04-04