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

 

 

 

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

from DoubleLinkedList import DoubleLinkedList, Node


class FIFOCache(object):
    def __init__(self, capacity):
        self.capacity = capacity
        self.size = 0
        self.map = {}   # 用map映射的意义:因为自己创建的链表,只是一堆对象,只不过他们的属性首尾相连而已
                        # 在链表类中,List是一个用来管理Node的类,很难查找到某一个node,所以选择加入一个键值元祖映射链表
                        # 使用了键值对,用key来映射一个node,node中有(key,value),这样就很容易管理这个list
                        # 这在python中不是数组,叫做元祖 d = { key1 : value1, key2 : value2 } 储存的就是键值对
        self.list = DoubleLinkedList(self.capacity)

    def get(self, key):  # 值不在缓存中
        if key not in self.map:
            return -1
        else:
            node = self.map.get(key)
            return node.value

    def put(self, key, value):
        if self.capacity == 0:
            return

        if key in self.map:  # 如果已经在缓冲中
            node = self.map.get(key)  # 按键来取值
            self.list.remove(node)
            node.value = value
            self.list.append(node)

        else:  # 不在缓存中
            if self.size == self.capacity:  # 缓存容量已满
                node = self.list.pop()
                del self.map[node.key]
                self.size -= 1
            node = Node(key, value)
            self.list.append(node)
            self.map[key] = node # 把key = x 和 value = y 以x:y的形式加入map = {} 元祖的尾部
            self.size += 1

    def print(self):  # 用于查看缓存中的数据,测试使用
        self.list.print()


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

 

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