LeetCode--146. LRU 缓存【Golang中的list】

146. LRU 缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。

实现 LRUCache 类:

  • LRUCache(int capacity)正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 getput 必须以 O(1) 的平均时间复杂度运行。


前言

好题,想写一下,虽然之前用C++写过一次,但是不太熟悉c++的面向对象,也是云里雾里的,只会写个函数,这次也想熟悉一下golang的container/list。

正文

由于要实现LRU的算法,最主要的就是要实现如何存储最近最少使用的Key,最合适的就是链表,至于根据Key来寻找Value的值,自然就是哈希表了。

于是思路就是这样的:

  1. Get()方法:根据给定的Key,在哈希表中查找,如果不存在,返回-1,如果存在则返回对应的val,并将我们维护的链表的对应的Key-Value更新到链表的最前面。
  2. Put()方法:先查找哈希表中是否存储了这一Key,如果已经存储,则更新Value的值了;如果没有存储,则先确认缓存的数据是否超出了限制,如果没有超出,则直接加入哈希表即可,并将相应的Key-Value推入到链表的最前面;如果超出了,则找到链表的尾部,找到相应的key值,删除哈希表中的对应的Key-Value,并删除链表尾部元素,再将新的Key-Value加入哈希表和链表前方。

代码如下:

go 复制代码
type LRUCache struct {
	capacity int
	kv       map[int]*list.Element
	KeyList  *list.List
}

type KV struct {
	Key   int
	Value int
}

func Constructor(capacity int) LRUCache {
	return LRUCache{
		capacity: capacity,
		kv:       make(map[int]*list.Element),
		KeyList:  list.New(),
	}
}

func (this *LRUCache) Get(key int) int {
	if elem, ok := this.kv[key]; ok {
		this.KeyList.MoveToFront(elem)
		return elem.Value.(KV).Value
	}
	return -1
}

func (this *LRUCache) Put(key int, value int) {
	if node := this.kv[key]; node != nil {
		node.Value = KV{
			Key:   key,
			Value: value,
		}
		this.KeyList.MoveToFront(node)
		return
	}
	if this.KeyList.Len() >= this.capacity {
		oldest := this.KeyList.Back()
		this.KeyList.Remove(oldest)
		delete(this.kv, oldest.Value.(KV).Key)
	}
	KeyValue := KV{Key: key, Value: value}
	elem := this.KeyList.PushFront(KeyValue)
	this.kv[key] = elem
}

结语

Golang里面有这么一个list真是太棒了~

相关推荐
啊阿狸不会拉杆12 分钟前
人工智能数学基础(四):线性代数
人工智能·python·数学·算法·机器学习
玖剹31 分钟前
矩阵区域和 --- 前缀和
数据结构·c++·算法·leetcode·矩阵·动态规划·1024程序员节
zwz宝宝34 分钟前
第三次作业(密码学)
java·数据结构·算法
sxtyjty1 小时前
tarjan缩点+强联通分量
算法
freyazzr1 小时前
Leetcode刷题 | Day50_图论02_岛屿问题01_dfs两种方法+bfs一种方法
数据结构·c++·算法·leetcode·深度优先·图论·广度优先
悦悦子a啊1 小时前
C++之string
开发语言·数据结构·c++
我想进大厂1 小时前
图论---LCA(倍增法)
数据结构·c++·算法·图论
明月看潮生1 小时前
青少年编程与数学 02-018 C++数据结构与算法 16课题、贪心算法
c++·算法·青少年编程·贪心算法·编程与数学
且听风吟ayan2 小时前
leetcode day37 474
leetcode·c#
机器学习之心2 小时前
飞蛾扑火算法优化+Transformer四模型回归打包(内含MFO-Transformer-LSTM及单独模型)
算法·回归·lstm·transformer·飞蛾扑火算法优化