• 模拟缓存双端循环链式数据结构



    核心思想是通过节节点的概念,存储每一个节点上一个节点和下一个节点的内存地址,然后每个节点中存储该节点的创建时间,每次取值判断,如果超出了自己设定的缓存时常,则清除节点。

    import datetime
    
    class Node:
    def __init__(self,value=None,next=None,prev=None,time=None):
    self.value,self.next,self.prev,self.time=value,next,prev,time
    
    class Bag:
    def __init__(self,maxsize=None):
    self.root = Node()
    self.root.next=self.root
    self.root.prev=self.root
    self.maxsize = None
    self.tailnode = self.root
    self.headnode = self.root
    self.length = 0
    
    def __len__(self):
    self.remove_by_time()
    return self.length
    
    def remove_by_time(self):
    curnode = self.root
    lis = []
    while True:
    curnode = curnode.next
    if curnode == self.root:
    break
    if datetime.datetime.now() - curnode.time > datetime.timedelta(seconds=60):
    lis.append(curnode.value)
    for i in lis:
    self.remove(i)
    
    def append(self,value):
    if self.maxsize is not None and self.length>=self.maxsize:
    raise Exception("Full")
    
    node=Node(value=value,time=datetime.datetime.now())
    
    if self.tailnode == self.root:
    self.root.next=node
    node.prev = self.root
    self.headnode=node
    else:
    node.prev=self.tailnode
    self.tailnode.next=node
    
    self.tailnode=node
    self.root.prev = node
    node.next = self.root
    
    self.length+=1
    
    def appendleft(self,value):
    if self.maxsize is not None and self.length>=self.maxsize:
    raise Exception("Full")
    
    node=Node(value=value,time=datetime.datetime.now())
    
    if self.tailnode==self.root:
    self.root.prev=node
    node.next=self.root
    self.tailnode=node
    else:
    node.next = self.headnode
    self.headnode.prev=node
    
    self.headnode = node
    self.root.next = node
    node.prev = self.root
    
    self.length+=1
    
    def iter_node(self):
    curnode = self.root
    while True:
    curnode = curnode.next
    if curnode == self.root:
    break
    yield curnode
    
    def __iter__(self):
    self.remove_by_time()
    for i in self.iter_node():
    yield i.value
    
    def remove(self,value):
    for i in self.iter_node():
    if i.value == value:
    if i==self.headnode:
    self.headnode=i.next
    if i==self.tailnode:
    self.tailnode=i.prev
    i.next.prev, i.prev.next = i.prev, i.next
    self.length -= 1
    return i
    return -1
  • 相关阅读:
    洛谷 P1313 计算系数
    洛谷 P1088 火星人
    洛谷 P1049 装箱问题
    P5016 龙虎斗
    洛谷P1208
    求lca
    没有上司的舞会
    最短路spfa
    懒羊羊找朋友
    简单的图论问题之单源最短路dijkstra算法
  • 原文地址:https://www.cnblogs.com/xuxingping/p/10946312.html
Copyright © 2020-2023  润新知