缓存机制 LRU 和 LFU

LRU 是least recently used的缩写,即最近最久未使用。在缓存数据量溢出时,必须淘汰某一项记录才能插入新的记录,而LRU算法则选择淘汰上一次使用时间距离现在最久的那条记录。
数据结构的设计

1、链表list用于保存value,并且从头到尾的顺序达标它最近使用时间(越靠前代表使用越近)
2、哈希表记录key对应的value在链表的位置。

具体设计:

get:
	如果哈希表中存在对应记录,则将其从链表中移除并加入到链表头部。(并且需要修改哈希表中key对应的位置)
put:
	调用get方法获取对应的记录,如果记录非空,则直接修改值并返回。
	否则需要判断此时缓存是否已满,已满则需要删除链表的尾端,(此位置为距离此时最久的使用记录)
	最后直接插入到list的头部

算法实现 LeetCode LRU缓存机制(双向链表、哈希表)


LFU 是least frequently used的缩写,即最少被使用。在缓存已满且需要加入新的记录时,选择缓存中被使用次数最少的记录(如果有多条,则选择其中使用时间距离现在最久的记录(LRU规则))。
数据结构的设计

1、哈希表一保存(key,val,freq),(freq是使用次数)
2、哈希表二保存(freq,list),freq是使用次数,list是使用次数为freq的所有key,并且按照从头到尾的顺序达标它最近使用时间(越靠前代表使用越近)
3、哈希表三保存(key, list::iterator),list::iterator代表的是key在f哈希表二中的迭代器

具体设计:

get:
	如果哈希表中有对应记录R,则将R先从自己所在的链表L中移除。自增对应的使用次数,并且修改在freq中的位置和迭代器
put:
	调用get方法取关键字对应的记录,如果存在则更新值并返回。
	否则需要判断缓存是否已满,已满则需要删除当前使用次数最少的key
	最后插入到哈希表一中,并且初始化使用次数为1(插入到哈希表二、哈希表三中)

算法实现 LeetCode LFU缓存(hash表)

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/88909721