欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)LRU算法

 更新時(shí)間:2022年05月25日 13:43:01   作者:旺旺小小超  
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)LRU緩存置換算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在第一節(jié)中已經(jīng)實(shí)現(xiàn)了雙向鏈表DoubleLinkedList類,本節(jié)我們基于雙向鏈表實(shí)現(xiàn)LRU(Least Recently Used最近最少使用)緩存置換算法。Redis的淘汰機(jī)制就包括LRU算法,用來(lái)淘汰那些最近最少使用的數(shù)據(jù),具體怎么使用可在redis的配置文件中設(shè)置。

一、LRU算法的實(shí)現(xiàn)

邏輯很簡(jiǎn)單,get和put兩種操作,其中g(shù)et時(shí)如果元素存在則將節(jié)點(diǎn)從當(dāng)前位置移到鏈表頭部,表示最近被訪問(wèn)到的節(jié)點(diǎn);put時(shí)也是,不管節(jié)點(diǎn)之前存不存在都要移動(dòng)到鏈表頭部。同樣通過(guò)一個(gè)map來(lái)實(shí)現(xiàn)查找時(shí)的O(1)復(fù)雜度。

class LRUCache(object):

? ? def __init__(self, capacity=0xffffffff):
? ? ? ? """
? ? ? ? LRU緩存置換算法 最近最少使用
? ? ? ? :param capacity:
? ? ? ? """
? ? ? ? self.capacity = capacity
? ? ? ? self.size = 0
? ? ? ? self.map = {}
? ? ? ? self.list = DoubleLinkedList(capacity)

? ? def get(self, key):
? ? ? ? """
? ? ? ? 獲取元素
? ? ? ? ? ? 獲取元素不存在 返回None
? ? ? ? ? ? 獲取元素已存在 將節(jié)點(diǎn)從當(dāng)前位置刪除并添加至鏈表頭部
? ? ? ? :param key:
? ? ? ? :return:
? ? ? ? """
? ? ? ? # 元素不存在
? ? ? ? if key not in self.map:
? ? ? ? ? ? return None

? ? ? ? node = self.map.get(key)
? ? ? ? self.list.remove(node)
? ? ? ? self.list.append_front(node)

? ? ? ? return node.value

? ? def put(self, key, value):
? ? ? ? """
? ? ? ? 添加元素
? ? ? ? ? ? 被添加的元素已存在 更新元素值并已到鏈表頭部
? ? ? ? ? ? 被添加的元素不存在
? ? ? ? ? ? ? ? 鏈表容量達(dá)到上限 刪除尾部元素
? ? ? ? ? ? ? ? 鏈表容量未達(dá)上限 添加至鏈表頭部
? ? ? ? :param key:
? ? ? ? :param value:
? ? ? ? :return:
? ? ? ? """
? ? ? ? if key in self.map:
? ? ? ? ? ? node = self.map.get(key)
? ? ? ? ? ? node.value = value
? ? ? ? ? ? self.list.remove(node)
? ? ? ? ? ? self.list.append_front(node)
? ? ? ? else:
? ? ? ? ? ? if self.size >= self.capacity:
? ? ? ? ? ? ? ? old_node = self.list.remove()
? ? ? ? ? ? ? ? del self.map[old_node.key]
? ? ? ? ? ? ? ? self.size -= 1

? ? ? ? ? ? node = Node(key, value)
? ? ? ? ? ? self.map[key] = node
? ? ? ? ? ? self.list.append_front(node)
? ? ? ? ? ? self.size += 1

? ? ? ? return node

? ? def print(self):
? ? ? ? """
? ? ? ? 打印當(dāng)前鏈表
? ? ? ? :return:
? ? ? ? """
? ? ? ? self.list.print()

二、測(cè)試邏輯

if __name__ == '__main__':
? ? lru_cache = LRUCache(3)
? ? lru_cache.put(1, 1)
? ? lru_cache.print()
? ? lru_cache.put(2, 2)
? ? lru_cache.print()
? ? print(lru_cache.get(1))
? ? lru_cache.print()
? ? lru_cache.put(3, 3)
? ? lru_cache.print()
? ? lru_cache.put(1, 100)
? ? lru_cache.print()
? ? lru_cache.put(4, 4)
? ? lru_cache.print()
? ? print(lru_cache.get(1))
? ? lru_cache.print()

測(cè)試結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python繪制直線的方法

    python繪制直線的方法

    這篇文章主要為大家詳細(xì)介紹了python繪制直線的方法,繪制直線通用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • python3 requests中使用ip代理池隨機(jī)生成ip的實(shí)例

    python3 requests中使用ip代理池隨機(jī)生成ip的實(shí)例

    今天小編就為大家分享一篇python3 requests中使用ip代理池隨機(jī)生成ip的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 使用Python3編寫抓取網(wǎng)頁(yè)和只抓網(wǎng)頁(yè)圖片的腳本

    使用Python3編寫抓取網(wǎng)頁(yè)和只抓網(wǎng)頁(yè)圖片的腳本

    這篇文章主要介紹了使用Python3編寫抓取網(wǎng)頁(yè)和只抓網(wǎng)頁(yè)圖片的腳本,使用到了urllib模塊,需要的朋友可以參考下
    2015-08-08
  • Python巧用SnowNLP實(shí)現(xiàn)生成srt字幕文件

    Python巧用SnowNLP實(shí)現(xiàn)生成srt字幕文件

    SnowNLP是一個(gè)可以方便的處理中文文本內(nèi)容的python類庫(kù),本文主要為大家詳細(xì)介紹了Python如何巧用SnowNLP實(shí)現(xiàn)將一段話一鍵生成srt字幕文件,感興趣的可以了解下
    2024-01-01
  • Pandas數(shù)據(jù)離散化原理及實(shí)例解析

    Pandas數(shù)據(jù)離散化原理及實(shí)例解析

    這篇文章主要介紹了Pandas數(shù)據(jù)離散化原理及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • pyqt遠(yuǎn)程批量執(zhí)行Linux命令程序的方法

    pyqt遠(yuǎn)程批量執(zhí)行Linux命令程序的方法

    今天小編就為大家分享一篇pyqt遠(yuǎn)程批量執(zhí)行Linux命令程序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • 如何利用python給微信公眾號(hào)發(fā)消息實(shí)例代碼

    如何利用python給微信公眾號(hào)發(fā)消息實(shí)例代碼

    使用過(guò)微信公眾號(hào)的小伙伴應(yīng)該知道微信公眾號(hào)有時(shí)候會(huì)給你推一些文章,當(dāng)你選擇它的某個(gè)功能時(shí),它還會(huì)返回一些信息,下面這篇文章主要給大家介紹了關(guān)于如何利用python給微信公眾號(hào)發(fā)消息的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • python之OpenCV的作用以及安裝案例教程

    python之OpenCV的作用以及安裝案例教程

    這篇文章主要介紹了python之OpenCV的作用以及安裝案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Linux下python3.7.0安裝教程

    Linux下python3.7.0安裝教程

    這篇文章主要為大家詳細(xì)介紹了Linux下python3.7.0安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • python抓取搜狗微信公眾號(hào)文章

    python抓取搜狗微信公眾號(hào)文章

    這篇文章主要為大家詳細(xì)介紹了python抓取搜狗微信公眾號(hào)文章,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評(píng)論