PythonはLRUキャッシュメカニズムを実装しています

最近、兄が面接の質問に出くわして一緒にやりました。質問はもともとjavaでしたが、兄の就職の面接は実際にはpythonなので、pythonで実装しました。

トピック:

知っているデータ構造を使用して、LRU(最近使用されていない)キャッシュメカニズムを設計および実装します。次の操作をサポートする必要があります:get data get and write dataput。

ここに画像の説明を挿入
具体的なアイデアと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