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算法的主要内容,如果未能解决你的问题,请参考以下文章