最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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算法,用來淘汰那些最近最少使用的數(shù)據(jù),具體怎么使用可在redis的配置文件中設(shè)置。

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

邏輯很簡單,get和put兩種操作,其中g(shù)et時(shí)如果元素存在則將節(jié)點(diǎn)從當(dāng)前位置移到鏈表頭部,表示最近被訪問到的節(jié)點(diǎn);put時(shí)也是,不管節(jié)點(diǎn)之前存不存在都要移動到鏈表頭部。同樣通過一個(gè)map來實(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()

二、測試邏輯

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()

測試結(jié)果:

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

相關(guān)文章

  • 教你用python實(shí)現(xiàn)一個(gè)無界面的小型圖書管理系統(tǒng)

    教你用python實(shí)現(xiàn)一個(gè)無界面的小型圖書管理系統(tǒng)

    今天帶大家學(xué)習(xí)怎么用python實(shí)現(xiàn)一個(gè)無界面的小型圖書管理系統(tǒng),文中有非常詳細(xì)的圖文解說及代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Python的輸入,輸出和標(biāo)識符詳解

    Python的輸入,輸出和標(biāo)識符詳解

    這篇文章主要介紹了介紹了Python的輸入,輸出和標(biāo)識符,有需要的朋友們可以參考一下,希望能給您帶來幫助
    2022-01-01
  • Python中可變變量與不可變變量詳解

    Python中可變變量與不可變變量詳解

    這篇文章主要介紹了Python中可變變量與不可變變量,但Python中沒有指針和引用的概念,導(dǎo)致很多時(shí)候參數(shù)的傳遞和調(diào)用的時(shí)候會產(chǎn)生疑問:我到底是復(fù)制了一份新的做操作還是在它指向的內(nèi)存操作?下面我們就帶著疑問去閱讀下面文章內(nèi)容吧
    2021-10-10
  • python調(diào)用機(jī)器喇叭發(fā)出蜂鳴聲(Beep)的方法

    python調(diào)用機(jī)器喇叭發(fā)出蜂鳴聲(Beep)的方法

    這篇文章主要介紹了python調(diào)用機(jī)器喇叭發(fā)出蜂鳴聲(Beep)的方法,實(shí)例分析了Python調(diào)用winsound模塊的使用技巧,需要的朋友可以參考下
    2015-03-03
  • 深入淺析python繼承問題

    深入淺析python繼承問題

    這篇文章主要介紹了深入淺析python繼承問題的相關(guān)資料,非常不錯(cuò),感興趣的朋友一起看看吧
    2016-05-05
  • 在Python中通過getattr獲取對象引用的方法

    在Python中通過getattr獲取對象引用的方法

    今天小編就為大家分享一篇在Python中通過getattr獲取對象引用的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python疲勞駕駛困倦低頭檢測功能的實(shí)現(xiàn)

    python疲勞駕駛困倦低頭檢測功能的實(shí)現(xiàn)

    這篇文章主要介紹了python疲勞駕駛困倦低頭檢測,該系統(tǒng)可以檢測一個(gè)人在開車時(shí)是否困倦,及時(shí)提醒,做到安全隱患排查,對實(shí)現(xiàn)代碼感興趣的朋友一起看看吧
    2022-04-04
  • 使用Python的Zato發(fā)送AMQP消息的教程

    使用Python的Zato發(fā)送AMQP消息的教程

    這篇文章主要介紹了使用Python的Zato發(fā)送AMQP消息的教程,主要是基于一些Zato的圖形化界面進(jìn)行操作,需要的朋友可以參考下
    2015-04-04
  • Python中第三方庫Requests庫的高級用法詳解

    Python中第三方庫Requests庫的高級用法詳解

    雖然Python的標(biāo)準(zhǔn)庫中urllib2模塊已經(jīng)包含了平常我們使用的大多數(shù)功能,但是它的API使用起來讓人實(shí)在感覺不好。它已經(jīng)不適合現(xiàn)在的時(shí)代,不適合現(xiàn)代的互聯(lián)網(wǎng)了。而Requests的誕生讓我們有了更好的選擇。本文就介紹了Python中第三方庫Requests庫的高級用法。
    2017-03-03
  • Python全棧之學(xué)習(xí)JS(3)

    Python全棧之學(xué)習(xí)JS(3)

    這篇文章主要為大家介紹了Python全棧之JS,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評論

辽中县| 扶风县| 新巴尔虎左旗| 唐山市| 利川市| 昌邑市| 礼泉县| 大荔县| 奇台县| 新竹市| 九江市| 东乡族自治县| 永济市| 洱源县| 勐海县| 兴义市| 建湖县| 莱阳市| 上栗县| 平南县| 寿光市| 临澧县| 承德市| 霍林郭勒市| 赣榆县| 金湖县| 常熟市| 罗甸县| 保山市| 梅河口市| 临高县| 吉木萨尔县| 同仁县| 琼结县| 乌拉特后旗| 镶黄旗| 南京市| 巴彦淖尔市| 儋州市| 河曲县| 应用必备|