打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
LRU

LRU - Python实现

忧桑的小兔子 2019-12-04 23:37:45
28
收藏 1
最后发布:2019-12-04 23:37:45首发:2019-12-04 23:37:45
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

github

#!/usr/bin/python3.6# -*- coding: utf-8 -*-"""参考: https://zhuanlan.zhihu.com/p/34133067"""from typing import Dict, Anyclass Node(object):    """ 双向链表节点 """    def __init__(self, key, value, prev=None, next_=None):        self.key = key        self.value = value        self.prev: Node = prev  # 前面的节点        self.next: Node = next_  # 后面的节点# from cachetools import LRUCache中使用的orderDictclass LruCache(object):    """ dict + 双向链表实现LRU, get/set的时间复杂度为O(1) """    def __init__(self, max_size=10):        self.cache: Dict[Any, Node] = {}        self.max_cache_size = max_size        self.head = Node(None, None)        self.tail = Node(None, None)        self.head.next = self.tail        self.tail.prev = self.head    def get(self, key, default=None):        if key in self.cache:            node = self.cache.get(key)            self._move_to_head(node)            return node.value        return default    def put(self, key, value):        if key in self.cache:            node = self.cache[key]            node.value = value            return self._move_to_head(node)        if len(self.cache) >= self.max_cache_size:            self._remove_tail()        node = Node(key, value)        self._add_node(node)    def _add_node(self, node: Node):        """ 新增节点到队首 """        node.prev = self.head        node.next = self.head.next        self.head.next.prev = node        self.head.next = node        self.cache[node.key] = node    def _move_to_head(self, node: Node):        """ 更新节点到队首 """        prev = node.prev        next_ = node.next        prev.next = next_        next_.prev = prev        self._add_node(node)    def _remove_tail(self):        if len(self.cache) < 1:            return        prev = self.tail.prev        if prev.key in self.cache:            self.cache.pop(prev.key)        node = prev.prev        node.next = self.tail        self.tail.prev = node        prev.prev = prev.next = None        del prev    def print_nodes(self):        head = self.head.next        while head is not self.tail:            print(head.key, end="->")            head = head.next        print("End")if __name__ == '__main__':    lru = LruCache(3)    appeared = set()    for i in [1, 2, 1, 3, 4, 3]:        if i not in appeared:            appeared.add(i)            lru.put(i, i)        else:            lru.get(i)        lru.print_nodes()
忧桑的小兔子

LRU - Python实现

忧桑的小兔子 2019-12-04 23:37:45
28
收藏 1
最后发布:2019-12-04 23:37:45首发:2019-12-04 23:37:45
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

github

#!/usr/bin/python3.6# -*- coding: utf-8 -*-"""参考: https://zhuanlan.zhihu.com/p/34133067"""from typing import Dict, Anyclass Node(object):    """ 双向链表节点 """    def __init__(self, key, value, prev=None, next_=None):        self.key = key        self.value = value        self.prev: Node = prev  # 前面的节点        self.next: Node = next_  # 后面的节点# from cachetools import LRUCache中使用的orderDictclass LruCache(object):    """ dict + 双向链表实现LRU, get/set的时间复杂度为O(1) """    def __init__(self, max_size=10):        self.cache: Dict[Any, Node] = {}        self.max_cache_size = max_size        self.head = Node(None, None)        self.tail = Node(None, None)        self.head.next = self.tail        self.tail.prev = self.head    def get(self, key, default=None):        if key in self.cache:            node = self.cache.get(key)            self._move_to_head(node)            return node.value        return default    def put(self, key, value):        if key in self.cache:            node = self.cache[key]            node.value = value            return self._move_to_head(node)        if len(self.cache) >= self.max_cache_size:            self._remove_tail()        node = Node(key, value)        self._add_node(node)    def _add_node(self, node: Node):        """ 新增节点到队首 """        node.prev = self.head        node.next = self.head.next        self.head.next.prev = node        self.head.next = node        self.cache[node.key] = node    def _move_to_head(self, node: Node):        """ 更新节点到队首 """        prev = node.prev        next_ = node.next        prev.next = next_        next_.prev = prev        self._add_node(node)    def _remove_tail(self):        if len(self.cache) < 1:            return        prev = self.tail.prev        if prev.key in self.cache:            self.cache.pop(prev.key)        node = prev.prev        node.next = self.tail        self.tail.prev = node        prev.prev = prev.next = None        del prev    def print_nodes(self):        head = self.head.next        while head is not self.tail:            print(head.key, end="->")            head = head.next        print("End")if __name__ == '__main__':    lru = LruCache(3)    appeared = set()    for i in [1, 2, 1, 3, 4, 3]:        if i not in appeared:            appeared.add(i)            lru.put(i, i)        else:            lru.get(i)        lru.print_nodes()
忧桑的小兔子

LRU - Python实现

忧桑的小兔子 2019-12-04 23:37:45
28
收藏 1
最后发布:2019-12-04 23:37:45首发:2019-12-04 23:37:45
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

github

#!/usr/bin/python3.6# -*- coding: utf-8 -*-"""参考: https://zhuanlan.zhihu.com/p/34133067"""from typing import Dict, Anyclass Node(object):    """ 双向链表节点 """    def __init__(self, key, value, prev=None, next_=None):        self.key = key        self.value = value        self.prev: Node = prev  # 前面的节点        self.next: Node = next_  # 后面的节点# from cachetools import LRUCache中使用的orderDictclass LruCache(object):    """ dict + 双向链表实现LRU, get/set的时间复杂度为O(1) """    def __init__(self, max_size=10):        self.cache: Dict[Any, Node] = {}        self.max_cache_size = max_size        self.head = Node(None, None)        self.tail = Node(None, None)        self.head.next = self.tail        self.tail.prev = self.head    def get(self, key, default=None):        if key in self.cache:            node = self.cache.get(key)            self._move_to_head(node)            return node.value        return default    def put(self, key, value):        if key in self.cache:            node = self.cache[key]            node.value = value            return self._move_to_head(node)        if len(self.cache) >= self.max_cache_size:            self._remove_tail()        node = Node(key, value)        self._add_node(node)    def _add_node(self, node: Node):        """ 新增节点到队首 """        node.prev = self.head        node.next = self.head.next        self.head.next.prev = node        self.head.next = node        self.cache[node.key] = node    def _move_to_head(self, node: Node):        """ 更新节点到队首 """        prev = node.prev        next_ = node.next        prev.next = next_        next_.prev = prev        self._add_node(node)    def _remove_tail(self):        if len(self.cache) < 1:            return        prev = self.tail.prev        if prev.key in self.cache:            self.cache.pop(prev.key)        node = prev.prev        node.next = self.tail        self.tail.prev = node        prev.prev = prev.next = None        del prev    def print_nodes(self):        head = self.head.next        while head is not self.tail:            print(head.key, end="->")            head = head.next        print("End")if __name__ == '__main__':    lru = LruCache(3)    appeared = set()    for i in [1, 2, 1, 3, 4, 3]:        if i not in appeared:            appeared.add(i)            lru.put(i, i)        else:            lru.get(i)        lru.print_nodes()
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
独木不成林
每一盆都价值连城,真是太漂亮了!
殷墟古玉古珠,难得一见!
难得一见,宋代定窑全集!
变压器360°全面分析,哪里不会看哪里!
九连墩战国楚墓出土金玉
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服