LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
实现:
基于双向链表实现。
1.访问元素时,将元素插入链表头部
2.按访问的时间排序,刚访问的排在前面
3.链表满时,把尾部元素删掉,将最新元素插入头部。
package main
type LRUNode struct {
key string
val interface{}
prev *LRUNode
next *LRUNode
}
type LRU struct {
dataMap map[string]*LRUNode
head *LRUNode
tail *LRUNode
capacity int
count int
}
func NewLRU(capacity int)LRU{
head := &LRUNode{}
tail := &LRUNode{}
head.next = tail
tail.prev = head
return LRU{head:head,tail:tail,capacity:capacity,count:0,dataMap:make(map[string]*LRUNode)}
}
func (L *LRU)Get(key string)interface{} {
v,ok:=L.dataMap[key]
if !ok {
return nil
}
//detach node
L.detachNode(v)
//insert first
L.insertFront(v)
return v.val
}
func (L *LRU)detachNode(node *LRUNode) {
node.