首页 > 其他分享 >go实现LRU

go实现LRU

时间:2024-03-28 21:26:49浏览次数:19  
标签:node head 实现 next lru key go LRU DoubleLinkNode

package main

import "fmt"

type LRUCache struct {
	length int
	cap    int
	cache  map[interface{}]*DoubleLinkNode
	head   *DoubleLinkNode
	tail   *DoubleLinkNode
}

// 双链表节点
// 头节点和尾节点不存数据,方便处理
type DoubleLinkNode struct {
	pre   *DoubleLinkNode
	next  *DoubleLinkNode
	key   interface{}
	value interface{}
}

func (lru *LRUCache) Get(key interface{}) interface{} {
	if _, ok := lru.cache[key]; !ok {
		return -1
	}

	node := lru.cache[key]
	lru.moveNodeToHead(node)
	return node.value
}

func (lru *LRUCache) Put(key interface{}, value interface{}) {
	if node, ok := lru.cache[key]; !ok {
		newNode := &DoubleLinkNode{
			key:   key,
			value: value,
		}

		if lru.length == lru.cap {
			tailPre := lru.tail.pre
			lru.removeNode(tailPre)
			delete(lru.cache, tailPre.key)
			lru.length--
		}

		lru.cache[key] = newNode
		lru.headInsertNode(newNode)
		lru.length++
	} else {
		node.value = value
		lru.moveNodeToHead(node)
	}
}

func (lru *LRUCache) moveNodeToHead(node *DoubleLinkNode) {
	lru.removeNode(node)
	lru.headInsertNode(node)
}

func (lru *LRUCache) removeNode(node *DoubleLinkNode) {
	node.pre.next = node.next
	node.next.pre = node.pre
}

func (lru *LRUCache) headInsertNode(node *DoubleLinkNode) {
	node.next = lru.head.next
	node.pre = lru.head

	lru.head.next.pre = node
	lru.head.next = node
}

func (lru *LRUCache) PrintLRUCache() {
	node := lru.head.next
	for node != lru.tail {
		fmt.Printf("%s:%d ", node.key, node.value)
		node = node.next
	}
	fmt.Println()
}

func NewLRUCache(cap int) *LRUCache {
	if cap < 0 {
		return nil
	}

	lru := &LRUCache{
		cap:   cap,
		cache: make(map[interface{}]*DoubleLinkNode),
		head:  &DoubleLinkNode{},
		tail:  &DoubleLinkNode{},
	}

	lru.head.next = lru.tail
	lru.tail.pre = lru.head

	return lru
}

func main() {
	lru := NewLRUCache(1)
	lru.Put("a", 1)
	lru.PrintLRUCache()
	lru.Put("b", 2)
	lru.PrintLRUCache()

	lru = NewLRUCache(3)
	lru.Put("a", 1)
	lru.Put("b", 2)
	lru.Put("c", 3)
	lru.PrintLRUCache()
	lru.Put("d", 4)
	lru.PrintLRUCache()
	lru.Get("b")
	lru.PrintLRUCache()
}

标签:node,head,实现,next,lru,key,go,LRU,DoubleLinkNode
From: https://www.cnblogs.com/WJQ2017/p/18102630

相关文章

  • 02-基于STM32F407MAC与DP83848实现以太网通讯六(IPerf网络速度测试)
    一、IPerf2网络测试工具Iperf2是一个用于测试网络带宽的工具。它是Iperf的旧版本,专注于提供基本的带宽测量功能。通过在客户端和服务器之间发送测试数据流并测量其性能,用户可以评估网络连接的速度和稳定性。Iperf2提供了一种简单而有效的方式来评估网络性能。IPerf3已经发布了,但......
  • 基于vue.js的购物商场的设计与实现
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频https://graduation-images.oss-cn-beijing.aliyuncs.com/videos/828%E5%A5%97ssm%E5%BD%95%E5%83%8F/10773_ssm616%E5%9F%BA%E4%BA%8Evue.js%E7%9A%84%E8%B4%AD%E7%89%A9%E5%95%86%E5%9C%BA......
  • Django框架之Django的安装与使用
    首先我们需要先确定好自己电脑上的python解释器环境,否则会导致后面项目所需要的库安装不了以及项目无法运行的问题。一、Django框架下载要下载Django并开始使用它,你可以按照以下步骤进行:1、安装Python首先,确保你的计算机上已经安装了Python。你可以从Python官方网站下载最......
  • SAT中的 width-based algorithm
    文献: KnotPipatsrisawat, AdnanDarwiche:Width-Based Restart PoliciesforClause-Learning Satisfiability Solvers. SAT 2009: 341-355 @inproceedings{DBLP:conf/sat/PipatsrisawatD09,author={KnotPipatsrisawatand......
  • Golang操作kafka遇到网络问题重试的案例
    草稿0、实际中会遇到网络抖动会导致消费者有一小段时间与kafka连接遇到问题~0、如何模拟网络问题?本地跑多个kafka实例直接关掉其中一个kafka服务??怎么模拟断网??1、kafka-go与sarama都演示一下2、一个consumer消费一个topic的例子;模拟网络问题可以把kafka服务关了~观察一下再开启k......
  • django小白必会
    Django基础1.Django小白必会三板斧1.1HttpResponse返回纯文本或者JSON数据fromdjango.shortcutsimportrender,HttpResponsedefindex(request):print(request)#HttpResponse:返回纯文本或者JSON数据returnHttpResponse("ok")1.2render渲染前端......
  • Ajax和django自带序列化组件
    Ajax和django自带序列化组件1.Ajax1.1Ajax介绍AJAX(AsynchronousJavascriptAndXML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。AJAX不是新的编程语言,而是一种使用现有标准的新方法......
  • 当 go 与 Java 相碰时,有什么不同?
    Go与Java全面对比及实际应用学习指南第一部分基础内容分析引言在快速发展的软件行业中,编程语言的选择对于项目的成功至关重要。Go与Java是目前两个非常流行的编程语言,本文将深入剖析这两种语言的特点,并对它们进行全面的比较。历史与哲学Go语言由Google在2009年推出,目......
  • 基于数据库实现分布式锁
    基于数据库实现分布式锁实现1.创建表CREATETABLE`methodLock`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'主键',`method_name`varchar(64)NOTNULLDEFAULT''COMMENT'锁定的方法名',`desc`varchar(1024)NOTNULLDEFAULT'备注信......
  • ALGO3 智能订单路由
    RIT案例简介–ALGO3版本1.01智能订单路由你在JPLoneganChase的算法交易台做暑期实习生,该公司是世界上最负盛名的金融机构。贵公司必须处理大额采购订单新的分散市场环境中的机构。满足监管要求至关重要以完成NBBO(全国最佳出价和报价)的订单。此外,考虑到分散的市场,通过最小化潜在......