第二章:LRU算法详解

labuladong LRU算法详解

146. LRU(Least Recently Used) 缓存机制

利用字典+双向链表

  • 字典里存的是Node的节点类,self.add(Node(key, value))
  • 传给add函数的是一个Node类,这个字典的键是node.key值是Node类
# 构建Node类
class Node:
    def __init__(self, key, val):
        self.key = key
        self.val = val
        self.prev = None
        self.next = None


class LRUCache:

    def __init__(self, capacity):
        # 构建首尾节点, 使之相连
        # 之后处理head到tail之间的node
        self.head = Node(0, 0)
        self.tail = Node(0, 0)
        self.head.next = self.tail
        self.tail.prev = self.head

        self.lookup = dict()
        self.max_len = capacity

    def get(self, key):
        if key in self.lookup:
            node = self.lookup[key]
            self.remove(node)
            self.add(node)
            return node.val
        else:
            return -1

    def put(self, key, value):
        if key in self.lookup:
            self.remove(self.lookup[key])# 移除该节点
        if len(self.lookup) == self.max_len:
            # 把表头位置节点删除(说明最近的数据值)
            self.remove(self.head.next)
        self.add(Node(key, value))

    # 删除链表节点
    def remove(self, node):
        del self.lookup[node.key] # 删除该节点
        node.prev.next = node.next # 更新链表
        node.next.prev = node.prev

    # 加在链表尾
    def add(self, node):
        self.lookup[node.key] = node # 添加(key ,node)节点
        pre_tail = self.tail.prev #暂存该节点
        node.next = self.tail #更新链表
        self.tail.prev = node
        pre_tail.next = node
        node.prev = pre_tail

   转载规则


《第二章:LRU算法详解》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
第二章:如何计算完全二叉树的节点数 第二章:如何计算完全二叉树的节点数
labuladong 如何计算完全二叉树的节点数 222. 完全二叉树的节点个数 完全二叉树都是紧凑靠左排列的 满二叉树每一层都是满的 (除底层的叶子节点外,左右孩子都有),是一种特殊的完全二叉树 遍历二叉树节点时: 若是普通的二叉树,
2020-08-02
下一篇 
第一章:贪心算法之区间调度问题 第一章:贪心算法之区间调度问题
labuladong贪心算法之区间调度问题 435. 无重叠区间 一天有好多活动,你可以选择不重叠的时间尽量多参加活动。 按照活动结束的时间排序后(不管开始得多早,都不如选择早点结束的活动,这样还能继续选其他活动) 假设当前参加的是活动A
2020-07-31
  目录