zoukankan      html  css  js  c++  java
  • 模拟缓存双端循环链式数据结构


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

    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
  • 相关阅读:
    oracle数据库物理结构逻辑结构内存区块进程管理
    系统的数据库设计
    大数据和高并发的解决方案总结
    Asp.net+WebSocket+Emgucv实时人脸识别
    初识Docker
    变位词程序的实现
    分布式系统常见问题#转载
    六类排序算法的C#实现
    Asp.net MVC 中Controller返回值类型ActionResult
    将应用程序中的一些参数写到xml配置文件中
  • 原文地址:https://www.cnblogs.com/xuxingping/p/10946312.html
Copyright © 2011-2022 走看看