美文网首页
2021-08-01 手撕LRU

2021-08-01 手撕LRU

作者: 何几时 | 来源:发表于2021-08-01 22:37 被阅读0次
class Node:
    def __init__(self, key, val):
        self.key = key
        self.val = val
        self.prev = None
        self.next = None


class DoubleList:
    def __init__(self):
        # 头指针、尾指针
        self.head = Node(0, 0)
        self.tail = Node(0, 0)
        self.head.next = self.tail
        self.tail.prev = self.head

        self.lenSize = 0

    # 尾插、头出、任意删
    def add_last(self, x):
        x.next = self.tail
        x.prev = self.tail.prev
        self.tail.prev.next = x
        self.tail.prev = x
        self.lenSize += 1

    def pop_head(self):
        if self.lenSize > 0:
            tmp = self.head.next
            self.remove_anywhere(tmp)
            return tmp

    def remove_anywhere(self, x):
        x.prev.next = x.next
        x.next.prev = x.prev
        self.lenSize -= 1

    def get_size(self):
        return self.lenSize


class LRU:
    def __init__(self, cap):
        self.map = {}
        self.cache = DoubleList()
        # 最大容量
        self.cap = cap

    def get(self, key):
        if key in self.map:
            self.make_recently(key)
            return self.map[key].val
        else:
            return -1

    def put(self, key, val):
        if key in self.map:
            self.remove(key)
            self.add_recently(key, val)
            return
        if self.cache.lenSize == self.cap:
            self.remove_least_used()
        self.add_recently(key, val)

    # 对手机后台的操作
    # 1. 打开新应用
    def add_recently(self, key, val):
        node = Node(key, val)
        node.prev = self.cache.tail.prev
        self.cache.tail.prev.next = node
        self.cache.tail.prev = node
        node.next = self.cache.tail
        # 放进map
        self.map[key] = node

    # 2. 打开后台应用
    def make_recently(self, key):
        node = self.map[key]
        self.cache.remove_anywhere(node)
        self.cache.add_last(node)

    # 3. 划掉后台应用
    def remove(self, key):
        node = self.map[key]
        self.cache.remove_anywhere(node)
        self.map.pop(key)

    # 4. 杀后台
    def remove_least_used(self):
        tmp = self.cache.pop_head()
        self.map.pop(tmp.key)

相关文章

  • 2021-08-01 手撕LRU

  • 手撕LRU

    import java.util.HashMap;import java.util.Map;public clas...

  • LRU手撕实现

    国庆期间,因玩忘学,愧疚难当,一时冲动,手撕算法,以表歉意。谈起LRU,实则对其心仪已久,之前也对其实现原理进行过...

  • 手撕一个LRU Cache

    前言 今天时间紧张,借一道经典面试题简单聊两句吧。 LeetCode 146 - LRU Cache 最近最少使用...

  • 想吃面包别出去买了,手把手教你做手撕包,香甜软糯,奶香浓郁

    手撕已经成为了中的一种常态,很多的是食品都有手撕版本,例如手撕牛肉,手撕豆腐干,手撕鸭,手撕鸡,手撕面包当然也有的...

  • 手撕鸡

    手撕鸡、手撕面包、手撕包菜、手撕牛肉,各种手撕做法,听起来就很手工的感觉。我做的手撕鸡纯粹懒人所为。 具体做法如下...

  • 美食十五-手撕鸡

    手撕鸡是一道家常菜,很难界定它的产地归属,手撕鸡有外皮金黄的盐焗鸡手撕,有风干鸡手撕,还有特色的手撕鸡丝。 手撕鸡...

  • 7月13日 星期五 多云

    手撕面包 我爱吃手撕面包。 今天早上,爸爸问我想吃什么?我说:“我想吃手撕面包。...

  • 【崔哥,您大胆往前冲!(1)】

    【崔哥,您大胆往前冲!(1)】 冯小刚要拍《手机2》,崔永元炸了。 他手撕冯小刚、手撕徐帆、手撕刘震云、手撕范冰冰...

  • 自己做的酸辣白菜,好香啊

    绝了,绝了,我真的是轻易不做饭,一做必惊艳啊。我这手撕辣白菜太好吃了!做法: 1.圆白菜洗净,手撕,一定要手撕,撕...

网友评论

      本文标题:2021-08-01 手撕LRU

      本文链接:https://www.haomeiwen.com/subject/iqarvltx.html