python 实现LRU缓存结构

283 阅读1分钟

设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为 k ,并有如下两个功能

  1. set(key, value):将记录(key, value)插入该结构

  2. get(key):返回key对应的value值

如:输入: [[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3 输出: [1,-1]

思路:采用链表实现 代码:

class my_node():

def __init__(self,key=None,value= None):
    self.key = key
    self.value = value
    self.pre = None
    self.next = None
    

class my_lru():

def __init__(self,size):
    self.size = size
    self.hashmap= {}
    self.head = my_node()
    self.tail = my_node()
    self.head.next = self.tail
    self.tail.pre = self.head
    
def move_to_tail(self,key):
    node = self.hashmap[key]
    node.pre.next = node.next
    node.next.pre = node.pre
    node.pre = self.tail.pre
    node.next = self.tail
    self.tail.pre.next = node
    self.tail.pre = node
def set_kv(self,key,value):
    if key in self.hashmap:
        # 如果key本身已经在哈希表中了就不需要在链表中加入新的节点
        # 但是需要更新字典该值对应节点的value
        self.hashmap[key].value = value
        # 之后将该节点移到末尾
        self.move_to_tail(key)
    else:
        if len(self.hashmap) == self.size:
            # 去掉哈希表对应项
            self.hashmap.pop(self.head.next.key)
            # 去掉最久没有被访问过的节点,即头节点之后的节点
            self.head.next = self.head.next.next
            self.head.next.pre = self.head
        # 如果不在的话就插入到尾节点前
        new = my_node(key, value)
        self.hashmap[key] = new
        new.pre = self.tail.pre
        new.next = self.tail
        self.tail.pre.next = new
        self.tail.pre = new
    
def get_key(self,key):
    # print(self.hashmap)
    if key in self.hashmap:
        # 如果已经在链表中了久把它移到末尾(变成最新访问的)
        self.move_to_tail(key)
    res = self.hashmap.get(key, -1)
    if res == -1:
        return res
    else:
        return res.value

class Solution:

def LRU(self , operators: List[List[int]], k: int) -> List[int]:
    lru = my_lru(int(k))
    result = []
    for i in range(len(operators)):
        if int(operators[i][0]) == 1:
            lru.set_kv(operators[i][1], operators[i][2])
        else:
            #print(operators[i][1])
            r = lru.get_key(int(operators[i][1]))
            result.append(int(r))
    return result