python实现LRU缓存机制

最近师兄碰到一道面试题,一起做了做,题目本来是java的,但师兄面试的岗位其实是python,所以我们用python进行了实现。

题目:

运用你所掌握的数据结构,设计和实现一个LRU(最近最少使用)缓存机制。它应该支持以下操作:获取数据get和写入数据put。

在这里插入图片描述
具体思路与java实现见:https://zhuanlan.zhihu.com/p/34133067

下面是python实现:

class DLinkedNode(object):
    def __init__(self, key, value):
        self.key = key
        self.value = value
        # 前驱
        self.pre = None
        # 后继
        self.post = None

    def __init__(self):
        self.key = None
        self.value = None
        # 前驱
        self.pre = None
        # 后继
        self.post = None


class LRUCache():
    def __init__(self, capacity):  # 构造函数
        self.count = 0
        self.capacity = capacity

        self.head = DLinkedNode()
        self.tail = DLinkedNode()

        self.head.post = self.tail
        self.tail.pre = self.head

        self.cache = {
    
    }

    def out(self):
        p = self.head
        while p.post != None:
            if p.value != None:
                print(p.value)
            p = p.post

    def get(self, key):
        node = self.cache[key]
        if node == None:
            return "raise exception"
        self.moveToHead(node)

        return node.value

    def set(self, key, value):
        try:
            node = self.cache[key]
        except KeyError:
            newNode = DLinkedNode()
            newNode.key = key
            newNode.value = value

            self.cache[key] = newNode
            self.addNode(newNode)

            self.count = self.count + 1
            if self.count > self.capacity:
                t = self.popTail()
                self.cache.pop(t.key)
                self.count = self.count - 1
        else:
            node.value = value
            self.moveToHead(node)

    def removeNode(self, node):
        pre = DLinkedNode()
        post = DLinkedNode()

        pre = node.pre
        post = node.post

        pre.post = post
        post.pre = pre

    def addNode(self, node):
        node.pre = self.head
        node.post = self.head.post

        self.head.post.pre = node
        self.head.post = node

    def moveToHead(self, node):
        self.removeNode(node)
        self.addNode(node)

    def popTail(self):
        res = self.tail.pre
        self.removeNode(res)
        return res


if __name__ == '__main__':
    l = LRUCache(3)
    l.set("key1", 7);
    l.set("key2", 0);
    l.set("key3", 1);
    l.set("key4", 2);
    l.get("key2")
    l.set("key5", 3)
    l.get("key2")
    l.set("key6", 4)
    l.out();

猜你喜欢

转载自blog.csdn.net/xiaohaigary/article/details/104072703