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

python基于雙向鏈表實(shí)現(xiàn)LFU算法

 更新時(shí)間:2022年05月25日 14:17:52   作者:旺旺小小超  
這篇文章主要為大家詳細(xì)介紹了python基于雙向鏈表實(shí)現(xiàn)LFU算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了python實(shí)現(xiàn)LFU算法的具體代碼,供大家參考,具體內(nèi)容如下

在第一節(jié)中實(shí)現(xiàn)了雙向鏈表DoubleLinkedList類,上一節(jié)中基于雙向鏈表實(shí)現(xiàn)了LRU算法,本節(jié)課我們繼續(xù)基于雙向鏈表實(shí)現(xiàn)LFU(Least frequently used 最不經(jīng)常使用)算法。

一、重寫Node節(jié)點(diǎn)類

構(gòu)建LFUNode類 繼承自第一節(jié)中的Node類,添加freq屬性用來表示節(jié)點(diǎn)使用頻率

class LFUNode(Node):

? ? def __init__(self, key, value):
? ? ? ? """
? ? ? ? LFU節(jié)點(diǎn) 增加頻率屬性
? ? ? ? :param key:
? ? ? ? :param value:
? ? ? ? """
? ? ? ? self.freq = 0
? ? ? ? super(LFUNode, self).__init__(key, value)

二、LFU實(shí)現(xiàn)

LFU的實(shí)現(xiàn)除了get和put之外還有一個(gè)私有的__update_freq更新節(jié)點(diǎn)頻率方法,讀寫某節(jié)點(diǎn)時(shí)都需要對(duì)該節(jié)點(diǎn)的頻率屬性進(jìn)行更新。除了map之外新增加一個(gè)freq_map來存儲(chǔ)每個(gè)頻率下的雙向鏈表,當(dāng)達(dá)到最大容量時(shí)移除最小頻率下的頭部的節(jié)點(diǎn)。

class LFUCache(object):

? ? def __init__(self, capacity=0xffffffff):
? ? ? ? """
? ? ? ? LFU緩存置換算法 最不經(jīng)常使用
? ? ? ? :param capacity:
? ? ? ? """
? ? ? ? self.capacity = capacity
? ? ? ? self.size = 0
? ? ? ? self.map = {}
? ? ? ? self.freq_map = {}

? ? def __update_freq(self, node):
? ? ? ? """
? ? ? ? 更新節(jié)點(diǎn)頻率
? ? ? ? :param node:
? ? ? ? :return:
? ? ? ? """
? ? ? ? freq = node.freq

? ? ? ? # 當(dāng)前節(jié)點(diǎn)所在頻率存在 在當(dāng)前頻率鏈表中移除當(dāng)前節(jié)點(diǎn)
? ? ? ? if freq in self.freq_map:
? ? ? ? ? ? node = self.freq_map[freq].remove(node)
? ? ? ? ? ? # 當(dāng)前頻率鏈表為空時(shí)刪除該頻率鏈表
? ? ? ? ? ? if self.freq_map[freq].size == 0:
? ? ? ? ? ? ? ? del self.freq_map[freq]

? ? ? ? # 將節(jié)點(diǎn)按照新頻率寫入頻率鏈表
? ? ? ? freq += 1
? ? ? ? node.freq = freq
? ? ? ? if freq not in self.freq_map:
? ? ? ? ? ? self.freq_map[freq] = DoubleLinkedList()
? ? ? ? self.freq_map[freq].append(node)

? ? ? ? return node

? ? def get(self, key):
? ? ? ? """
? ? ? ? 獲取元素
? ? ? ? :return:
? ? ? ? """
? ? ? ? # 節(jié)點(diǎn)不存在
? ? ? ? if key not in self.map:
? ? ? ? ? ? return None

? ? ? ? # 節(jié)點(diǎn)存在 更新使用頻率
? ? ? ? old_node = self.map.get(key)
? ? ? ? new_node = self.__update_freq(old_node)
? ? ? ? self.map[key] = new_node

? ? ? ? return new_node.value

? ? def put(self, key, value):
? ? ? ? """
? ? ? ? 設(shè)置元素
? ? ? ? :param key:
? ? ? ? :param value:
? ? ? ? :return:
? ? ? ? """
? ? ? ? # 節(jié)點(diǎn)已存在 更新頻率
? ? ? ? if key in self.map:
? ? ? ? ? ? old_node = self.map.get(key)
? ? ? ? ? ? old_node.value = value
? ? ? ? ? ? new_node = self.__update_freq(old_node)
? ? ? ? ? ? self.map[key] = new_node
? ? ? ? else:
? ? ? ? ? ? # 節(jié)點(diǎn)容量達(dá)到上限 移除最小頻率鏈表頭部的節(jié)點(diǎn)
? ? ? ? ? ? if self.size >= self.capacity:
? ? ? ? ? ? ? ? min_freq = min(self.freq_map)
? ? ? ? ? ? ? ? node = self.freq_map[min_freq].pop()
? ? ? ? ? ? ? ? del self.map[node.key]
? ? ? ? ? ? ? ? self.size -= 1

? ? ? ? ? ? # 構(gòu)建新的節(jié)點(diǎn) 更新頻率
? ? ? ? ? ? new_node = LFUNode(key, value)
? ? ? ? ? ? new_node = self.__update_freq(new_node)
? ? ? ? ? ? self.map[key] = new_node
? ? ? ? ? ? self.size += 1

? ? ? ? return new_node

? ? def print(self):
? ? ? ? """
? ? ? ? 打印當(dāng)前鏈表
? ? ? ? :return:
? ? ? ? """
? ? ? ? for freq, link in self.freq_map.items():
? ? ? ? ? ? print("frequencies: %d" % freq)
? ? ? ? ? ? link.print()

三、測試邏輯

if __name__ == '__main__':
? ? lfu_cache = LFUCache(4)
? ? lfu_cache.put(1, 1)
? ? lfu_cache.print()
? ? lfu_cache.put(2, 2)
? ? lfu_cache.print()
? ? print(lfu_cache.get(1))
? ? lfu_cache.print()
? ? lfu_cache.put(3, 3)
? ? lfu_cache.print()
? ? lfu_cache.put(4, 4)
? ? lfu_cache.print()
? ? lfu_cache.put(5, 5)
? ? lfu_cache.print()
? ? print(lfu_cache.get(2))
? ? lfu_cache.put(4, 400)
? ? lfu_cache.print()

測試結(jié)果:

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

相關(guān)文章

  • python爬蟲實(shí)現(xiàn)POST request payload形式的請(qǐng)求

    python爬蟲實(shí)現(xiàn)POST request payload形式的請(qǐng)求

    這篇文章主要介紹了python爬蟲實(shí)現(xiàn)POST request payload形式的請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python讀取圖片的方法詳解

    Python讀取圖片的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Python中讀取圖片的實(shí)現(xiàn)方法,文中的示例代碼簡潔易懂,具有一定的參考價(jià)值,需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • python中pandas操作apply返回多列的實(shí)現(xiàn)

    python中pandas操作apply返回多列的實(shí)現(xiàn)

    本文主要介紹了python中pandas操作apply返回多列的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Python基礎(chǔ)實(shí)戰(zhàn)總結(jié)

    Python基礎(chǔ)實(shí)戰(zhàn)總結(jié)

    今天要給大家介紹的是Python基礎(chǔ)實(shí)戰(zhàn),本文主要以舉例說明講解:問題的關(guān)鍵點(diǎn)就是在于構(gòu)造姓名,學(xué)號(hào)和成績,之后以字典的形式進(jìn)行寫入文件。這里準(zhǔn)備兩個(gè)列表,一個(gè)姓,一個(gè)名,之后使用random庫進(jìn)行隨機(jī)字符串拼接,得到姓名,需要的朋友可以參考一下
    2021-10-10
  • 在Python中測試訪問同一數(shù)據(jù)的競爭條件的方法

    在Python中測試訪問同一數(shù)據(jù)的競爭條件的方法

    這篇文章主要介紹了在Python中測試訪問同一數(shù)據(jù)的競爭條件的方法,探究多線程或多進(jìn)程情況下優(yōu)先訪問權(quán)的問題,需要的朋友可以參考下
    2015-04-04
  • python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之K均值聚類

    python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之K均值聚類

    這篇文章主要為大家詳細(xì)介紹了python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之K均值聚類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • pytest配置文件pytest.ini的配置、原理與實(shí)際應(yīng)用詳解

    pytest配置文件pytest.ini的配置、原理與實(shí)際應(yīng)用詳解

    在Python的測試生態(tài)中,pytest無疑是最受歡迎的測試框架之一,在pytest的眾多配置文件中,pytest.ini無疑是最為重要和常用的一個(gè),本文將深入探討pytest.ini的配置、工作原理以及實(shí)際應(yīng)用場景,幫助讀者更好地理解和使用這一強(qiáng)大的工具,需要的朋友可以參考下
    2025-03-03
  • python算法表示概念掃盲教程

    python算法表示概念掃盲教程

    這篇文章主要為大家詳細(xì)介紹了python算法表示概念掃盲教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Pandas數(shù)據(jù)連接pd.concat的實(shí)現(xiàn)

    Pandas數(shù)據(jù)連接pd.concat的實(shí)現(xiàn)

    本文主要介紹了Pandas數(shù)據(jù)連接pd.concat的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • python實(shí)現(xiàn)名片管理器的示例代碼

    python實(shí)現(xiàn)名片管理器的示例代碼

    這篇文章主要介紹了python實(shí)現(xiàn)名片管理器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論

阳山县| 黑龙江省| 兰考县| 武强县| 平南县| 晋中市| 平湖市| 广元市| 达州市| 贡山| 龙岩市| 嘉鱼县| 夹江县| 西充县| 黑水县| 宣威市| 永川市| 岑巩县| 察雅县| 乐业县| 永丰县| 平舆县| 托克逊县| 孙吴县| 康保县| 额尔古纳市| 荣昌县| 安仁县| 肃南| 平度市| 庆云县| 阿图什市| 栖霞市| 自治县| 铁力市| 册亨县| 乌拉特中旗| 江孜县| 宣化县| 乐清市| 特克斯县|