单链表 python,python单向链表
这篇文章主要为大家详细介绍了大蟒基于双向链表实现最少使用算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了大蟒实现最少使用算法的具体代码,供大家参考,具体内容如下
在第一节中实现了双向链表双重链接列表类,上一节中基于双向链表实现了最近最少使用算法算法,本节课我们继续基于双向链表实现LFU(最不常用最不经常使用)算法。
一、重写Node节点类
构建LFUNode类继承自第一节中的结节类,添加频率属性用来表示节点使用频率
LFUNode类(节点):
def __init__(self,key,value):
最少使用节点增加频率属性
:参数键:
:参数值:
self.freq=0
超级(LFUNode,self).__init__(键,值)
二、LFU实现
最少使用的实现除了得到和放之外还有一个私有的_ _更新频率更新节点频率方法,读写某节点时都需要对该节点的频率属性进行更新。除了地图之外新增加一个频率图来存储每个频率下的双向链表,当达到最大容量时移除最小频率下的头部的节点。
LFUCache类(对象):
def __init__(self,capacity=0xffffffff):
最少使用缓存置换算法最不经常使用
:参数容量:
自我能力=能力
self.size=0
self.map={}
self.freq_map={}
def __update_freq(self,node):
更新节点频率
:参数节点:
:返回:
频率=节点。频率
# 当前节点所在频率存在在当前频率链表中移除当前节点
if freq in self.freq_map:
node=self.freq_map[freq].移除(节点)
# 当前频率链表为空时删除该频率链表
if self.freq_map[freq].size==0:
del self.freq_map[freq]
# 将节点按照新频率写入频率链表
频率=1
node.freq=频率
如果频率不在self.freq_map:中
自我。freq _ map[freq]=双向链表()
self.freq_map[freq].追加(节点)
返回节点
def get(self,key):
获取元素
:返回:
# 节点不存在
如果密钥不在self.map:中
不返回
# 节点存在更新使用频率
old_node=self.map.get(key)
新节点=自身。_ _更新频率(旧节点)
self.map[key]=新节点
返回新节点值
定义put(自身,键,值):
设置元素
:参数键:
:参数值:
:返回:
# 节点已存在更新频率
如果键入self.map:
old_node=self.map.get(key)
旧节点值=值
新节点=自身。_ _更新频率(旧节点)
self.map[key]=新节点
else:
# 节点容量达到上限移除最小频率链表头部的节点
if self.size=self.capacity:
min_freq=min(self.freq_map)
node=self.freq_map[min_freq].流行()
del self.map[node.key]
self.size -=1
# 构建新的节点更新频率
new_node=LFUNode(键,值)
新节点=自身。_ _更新频率(新节点)
self.map[key]=新节点
self.size=1
返回新节点
自定义打印(自助):
打印当前链表
:返回:
对于频率,请链接self.freq_map.items():
打印(频率:%d %频率
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()
测试结果:
这就是本文的全部内容。希望对大家的学习有所帮助,也希望大家能支持盛行的IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。