2021-08-01 手撕LRU

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)

    # 對(duì)手機(jī)后臺(tái)的操作
    # 1. 打開(kāi)新應(yīng)用
    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
        # 放進(jìn)map
        self.map[key] = node

    # 2. 打開(kāi)后臺(tái)應(yīng)用
    def make_recently(self, key):
        node = self.map[key]
        self.cache.remove_anywhere(node)
        self.cache.add_last(node)

    # 3. 劃掉后臺(tái)應(yīng)用
    def remove(self, key):
        node = self.map[key]
        self.cache.remove_anywhere(node)
        self.map.pop(key)

    # 4. 殺后臺(tái)
    def remove_least_used(self):
        tmp = self.cache.pop_head()
        self.map.pop(tmp.key)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容