当前位置:   article > 正文

算法——LRU缓存算法设计_请你设计并实现一个满足 lru (最近最少使用) 缓存 约束的数据结构。 实现 lrucach

请你设计并实现一个满足 lru (最近最少使用) 缓存 约束的数据结构。 实现 lrucach

要求:请你设计并实现一个满足 LRU (Least Recently Used 最近最少使用) 缓存 约束的数据结构。
函数 get 和put 必须以 O(1) 的平均时间复杂度运行。

思路:采用 字典 + 双向链表
图解:LRU算法图解

swift:

public class Solution {

    class Node {
        //需要存储key 移除key-value需要 key
        var key: Int
        var value: Int
        var left: Node?
        var right: Node?
        init(key :Int=0, value: Int=0, left: Node?=nil, right: Node?=nil) {
            self.key = key
            self.value = value
            self.left = left
            self.right = right
        }
    }
    
    private var dic = Dictionary<Int, Node>.init()
    private var capacity = 0
    private var headNode = Node.init(key: -1, value: -1, left: nil, right: nil)
    private var tailNode = Node.init(key: -1, value: -1, left: nil, right: nil)

    init(_ capacity: Int) {
        self.capacity = capacity
        self.headNode.right = self.tailNode
        self.tailNode.left = self.headNode
    }
    
    func get(_ key: Int) -> Int {
        if !self.dic.keys.contains(key){
            return -1
        }else{
            self.swapNode(self.dic[key]!)
            return self.dic[key]!.value
        }
    }
    
    func set(_ key: Int, _ value: Int) {
        if !self.dic.keys.contains(key){
            let node = Node.init(key: key, value: value, left: nil, right: nil)
            if self.dic.count < self.capacity {
                self.addNodeToFirst(node)
                self.dic.updateValue(node, forKey: key)
            }else{
                self.addNodeToFirst(node)
                self.dic.updateValue(node, forKey: key)
                //移除最久未使用(重要)
                self.dic.removeValue(forKey: self.tailNode.left!.key)
                self.removeNode(self.tailNode.left!)
            }
        }else{
            let node = self.dic[key]!
            node.value = value
            self.swapNode(node)
        }
    }
    
    private func swapNode(_ node: Node) {
        if node.left!.value != -1{
            //移除先前节点
            self.removeNode(node)
            //插入节点
            self.addNodeToFirst(node)
        }
    }
   
    private func addNodeToFirst(_ node: Node) {
        node.right = self.headNode.right
        self.headNode.right!.left = node
        self.headNode.right = node
        node.left = self.headNode
    }
    
    private func removeNode(_ node: Node) {
        node.left!.right = node.right
        node.right!.left = node.left
    }
    
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/491699
推荐阅读
相关标签
  

闽ICP备14008679号