Goland 实现LRU算法

Posted 魏小言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Goland 实现LRU算法相关的知识,希望对你有一定的参考价值。

文章目录


最强解析面试题:Goland 实现LRU算法

文章讲解 “ Goland 实现LRU算法 ” 经典面试题,包含思路及源码,及解惑!

题目

Goland实现LRU算法

思路

将put/get 的节点追加在链表尾部,当put超出设定大小时,删除头节点

  • Get:查看 map 存在,进行refresh:remove-add[删除原节点,添加至末尾],返回 value;不存在返回 -1;
  • Put:查看 map 存在,覆盖 map 数值;否则查看 size ,超出进行 remove 头节点,添加至尾节点,无超出,则追加尾节点;

代码

type Node struct 
   K    interface
   V    interface
   Pre  *Node
   Next *Node

type Lru struct 
   Head *Node
   End  *Node
   S    int
   Map  map[interface]*Node



func NewL(s int) *Lru 
   l := &Lru
      S: s,
   
   l.Map = make(map[interface]*Node, s)
   return l



func (l *Lru) Get(k interface) interface 
   if v, ok := l.Map[k]; ok 
      l.refresh(v)
      return v.V
   
   return -1



func (l *Lru) Put(k, v interface) 
   if v, ok := l.Map[k]; ok 
      v.V = v
      l.refresh(v)
      return
   
   if len(l.Map) >= l.S 
      old := l.remove(l.Head)
      delete(l.Map, old)
   
   node := &Node
      K: k,
      V: v,
   
   l.add(node)
   l.Map[k] = node
   return



func (l *Lru) refresh(node *Node) 
   if node == l.End 
      return
   
   l.remove(node)
   l.add(node)



func (l *Lru) remove(node *Node) interface 
   if node == l.End 
      l.End = l.End.Pre
   
   if node == l.Head 
      l.Head = l.Head.Next
    else 
      node.Pre.Next = node.Next
      node.Next.Pre = node.Pre
   
   return node.K



func (l *Lru) add(node *Node) 
   if l.Head != nil 
      l.Head = node
      return
   
   if l.End != nil 
      l.End.Next = node
      node.Pre = l.End
   
   l.End = node
   return

附录

在数据库的世界里,数据从来都不重要,日志才是最重要的,有了日志就有了一切。

以上是关于Goland 实现LRU算法的主要内容,如果未能解决你的问题,请参考以下文章

图解LRU算法

如何实现一个LRU算法?

Chapter 6 链表(上):如何实现LRU缓存淘汰算法?

LRU算法list链表实现

Java实现一个LRU算法

手写Redis淘汰策略中lru算法(删除最近未使用的值) java版