• LRU算法


    LRU 算法就是⼀种缓存淘汰策略,全称是 Least Recently Used,也就是说我们认为最近使⽤过的 数据应该是是「有⽤的」,很久都没⽤过的数据应该是⽆⽤的,内存满了就优先删那些很久没⽤过的数据。

    type LRUCache struct {
        size int
        capacity int
        cache map[int]*DLinkedNode
        head, tail *DLinkedNode
    }
    
    type DLinkedNode struct {
        key, value int
        prev, next *DLinkedNode
    }
    
    func initDLinkedNode(key, value int) *DLinkedNode {
        return &DLinkedNode{
            key: key,
            value: value,
        }
    }
    
    func Constructor(capacity int) LRUCache {
        l := LRUCache{
            cache: map[int]*DLinkedNode{},
            head: initDLinkedNode(0, 0),
            tail: initDLinkedNode(0, 0),
            capacity: capacity,
        }
        l.head.next = l.tail
        l.tail.prev = l.head
        return l
    }
    
    func (this *LRUCache) Get(key int) int {
        if _, ok := this.cache[key]; !ok {
            return -1
        }
        node := this.cache[key]
        this.moveToHead(node)
        return node.value
    }
    
    
    func (this *LRUCache) Put(key int, value int)  {
        if _, ok := this.cache[key]; !ok {
            node := initDLinkedNode(key, value)
            this.cache[key] = node
            this.addToHead(node)
            this.size++
            if this.size > this.capacity {
                removed := this.removeTail()
                delete(this.cache, removed.key)
                this.size--
            }
        } else {
            node := this.cache[key]
            node.value = value
            this.moveToHead(node)
        }
    }
    
    func (this *LRUCache) addToHead(node *DLinkedNode) {
        node.prev = this.head
        node.next = this.head.next
        this.head.next.prev = node
        this.head.next = node
    }
    
    func (this *LRUCache) removeNode(node *DLinkedNode) {
        node.prev.next = node.next
        node.next.prev = node.prev
    }
    
    func (this *LRUCache) moveToHead(node *DLinkedNode) {
        this.removeNode(node)
        this.addToHead(node)
    }
    
    func (this *LRUCache) removeTail() *DLinkedNode {
        node := this.tail.prev
        this.removeNode(node)
        return node
    }
    

      

  • 相关阅读:
    五子棋人机对战设计
    通过getSystemServices获取手机管理大全
    C#常见错误解决方法
    🍖数据增删改查页面搭建
    🍖django ORM 表关系与django 请求生命周期流程图
    🍖django ORM 简介
    🍖Python与django连接数据库
    🍖静态文件配置与request对象
    开启进程的两种方式
    进程PID 与PPID
  • 原文地址:https://www.cnblogs.com/mango1997/p/16106956.html
Copyright © 2020-2023  润新知