计算机原理实践_LRU缓存置换算法_笔记

 

 

 

#! -*- encoding=utf-8 -*-

from DoubleLinkedList import DoubleLinkedList, Node


class LRUcache(object):
    def __init__(self, capacity):
        self.capacity = capacity
        self.map = {}
        self.list = DoubleLinkedList(self.capacity)

    def get(self, key):
        if key in self.map:
            node = self.map.get(key)
            self.list.remove(node)
            self.list.append_front(node)
            return node.value
        else:
            return -1

    def put(self, key, value):
        # 如果这个键已经在缓存中 , 需要更新新的值 ,以及把这个键值对组合放在list的头部,并且更新map中的值
        if key in self.map:
            node = self.map.get(key)
            self.list.remove(node)
            node.value = value
            self.list.append_front(node)

        # 键未在缓存中
        else:
            node = Node(key, value)
            if self.list.size >= self.capacity:  # 缓存已满
                old_node = self.list.remove()  # 默认删除尾部的节点
                del self.map[old_node.key]
                self.list.append_front(node)
                self.map[key] = node
                # self.list.size -= 1  # 不需要再对list的size进行操作
            else:
                self.list.append_front(node)
                self.map[key] = node
                # self.list.size += 1  # 不需要再对list的size进行操作

    def print(self): # 把缓存中的内容打印
        self.list.print()


if __name__ == '__main__':
    cache = LRUcache(2)
    cache.put(1, 1)
    cache.print()
    cache.put(2, 2)
    cache.print()
    cache.put(3, 3)
    cache.print()
    print(cache.get(1))
    cache.print()
    print(cache.get(2))
    cache.print()
    print(cache.get(3))
    cache.print()

 

posted @ 2019-11-07 11:20  焚舟破釜  阅读(217)  评论(0)    收藏  举报