golang LRU

LRU算法基于历史访问记录淘汰数据,最近访问的元素被认为未来访问概率更高。本文介绍了使用Go语言实现LRU的双向链表方法,包括访问元素时将其移到链表头部,按访问时间排序,并在链表满时删除最不常访问的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.prev.next = node.next
	node.next.prev = node.prev
}
func (L *LRU)insertFront(node *LRUNode)  {
	node.next = L.head.next
	L.head.next = node
	node.prev = L.head
}

func (L *LRU)delLast(){
	tmp:=L.tail.prev
	tmp.prev.next = L.tail
	L.tail.prev = tmp.prev
	tmp.next = nil
	tmp.prev = nil
	L.count = L.count-1
	delete(L.dataMap,tmp.key)
}
func (L *LRU)Set(key string,val interface{}){
	v,ok :=L.dataMap[key]
	if !ok {
		node :=&LRUNode{key:key,val:val}
		if L.count==L.capacity{
			L.delLast()
		}
		L.dataMap[key] = node
		L.insertFront(node)
		L.count = L.count+1
	}else {
		L.detachNode(v)
		L.insertFront(v)
	}
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值