首页 > 编程语言 >LFU算法实现

LFU算法实现

时间:2024-07-07 15:57:15浏览次数:13  
标签:缓存 实现 cache list elem LFU 算法 frequency key

LFU (Least Frequently Used) 是一种用于缓存管理的算法。它通过跟踪每个缓存项被访问的频率来决定哪些项应该被移除。LFU算法倾向于保留那些使用频率较高的项,而移除那些使用频率较低的项。以下是LFU算法的详细介绍:

工作原理

  1. 计数器:每个缓存项都有一个计数器,用于记录该项被访问的次数。
  2. 增加计数:每次缓存项被访问时,其计数器加一。
  3. 移除策略:当缓存满时,移除计数器值最小的项。如果有多个项的计数器值相同,则根据预定规则(如最早被访问的项)移除其中一个。

实现

LFU算法的实现可以使用多种数据结构,如哈希表、双向链表和优先队列。以下是一种常见的实现方法:

使用哈希表和优先队列

  1. 哈希表 (cache):用于存储缓存项及其计数器。
  2. 优先队列 (min-heap):用于快速找到计数器值最小的项。

具体步骤如下:

  1. 插入/更新缓存项

    • 如果缓存项已存在,更新其计数器并调整优先队列中的位置。
    • 如果缓存项不存在,检查缓存是否已满。如果已满,移除优先队列中计数器值最小的项,然后插入新项。
  2. 访问缓存项

    • 如果缓存项存在,更新其计数器并调整优先队列中的位置。
    • 如果缓存项不存在,返回未命中。

应用场景

LFU算法适用于以下场景:

  • 数据访问具有明显的热点数据,且热点数据相对稳定。
  • 需要高效管理缓存资源,减少缓存未命中率。

Go实现

package lfu

import (
	"container/list"
	"sync"
)

type entry struct {
	key   any
	value any
	freq  int
}

type LFUCache struct {
	mtx       sync.Mutex // protects the cache
	capacity  int
	size      int
	minFreq   int
	cache     map[any]*list.Element
	frequency map[int]*list.List
}

// NewLFUCache creates a new LFU cache
func NewLFUCache(capacity int) *LFUCache {
	return &LFUCache{
		capacity:  capacity,
		cache:     make(map[any]*list.Element),
		frequency: make(map[int]*list.List),
	}
}

// Get retrieves a value from the cache
func (c *LFUCache) Get(key any) any {
	c.mtx.Lock()
	defer c.mtx.Unlock()
	if elem, found := c.cache[key]; found {
		c.incrementFrequency(elem)
		return elem.Value.(*entry).value
	}
	return nil
}

// Put inserts or updates a value in the cache
func (c *LFUCache) Put(key, value any) {
	c.mtx.Lock()
	defer c.mtx.Unlock()

	if c.capacity == 0 {
		return
	}

	if elem, found := c.cache[key]; found {
		elem.Value.(*entry).value = value
		c.incrementFrequency(elem)
	} else {
		if c.size == c.capacity {
			c.evict()
		}
		newEntry := &entry{key, value, 1}
		if c.frequency[1] == nil {
			c.frequency[1] = list.New()
		}
		elem := c.frequency[1].PushFront(newEntry)
		c.cache[key] = elem
		c.minFreq = 1
		c.size++
	}
}

// incrementFrequency increases the frequency of a cache entry
func (c *LFUCache) incrementFrequency(elem *list.Element) {
	e := elem.Value.(*entry)
	oldFreq := e.freq
	e.freq++

	c.frequency[oldFreq].Remove(elem)
	if c.frequency[oldFreq].Len() == 0 {
		delete(c.frequency, oldFreq)
		if c.minFreq == oldFreq {
			c.minFreq++
		}
	}

	if c.frequency[e.freq] == nil {
		c.frequency[e.freq] = list.New()
	}
	newElem := c.frequency[e.freq].PushFront(e)
    c.cache[e.key] = newElem
}

// evict removes the least frequently used cache entry
func (c *LFUCache) evict() {
	list := c.frequency[c.minFreq]
	elem := list.Back()
	if elem != nil {
		list.Remove(elem)
		delete(c.cache, elem.Value.(*entry).key)
		c.size--
	}
}

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特


标签:缓存,实现,cache,list,elem,LFU,算法,frequency,key
From: https://www.cnblogs.com/lianshuiwuyi/p/18288586

相关文章

  • MATLAB算法实战应用案例精讲-【数模应用】偏最小二乘回归分析(PLS)(附MATLAB和python代码
    目录前言知识储备回归的方法回归的检验算法原理数学模型偏最小二乘回归建模原理:PLS的准则函数偏最小二乘基本算法​编辑 ​编辑PLS回归模型算法思想PLS回归与MLS、PCR、MRA比较SPSSAU案例应用其他说明SPSS示例(PLS命令) 变量列表(PLS命令) MODEL......
  • 目标检测算法简介
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • 图神经网络版本的Kolmogorov Arnold(KAN)代码实现和效果对比
    MLP是多层感知器(MultilayerPerceptron)的缩写,它是一种前馈人工神经网络。MLP由至少三层节点组成:一个输入层、一个或多个隐藏层以及一个输出层。每一层的节点都与下一层的每个节点相连,并且每个连接都有一个权重。MLP通过这些权重和节点的激活函数来学习输入数据的模式。Kolmogorov......
  • [Leetcode]经典算法
    检测环快慢指针法是一种用于检测链表中是否存在环的有效方法,同时也可以找到环的起点。该方法的原理基于两个指针在链表上同时移动,其中一个移动得更快,而另一个移动得更慢。检测环的存在:使用两个指针,一个称为快指针(fast),一个称为慢指针(slow)。在每一步中,快指针向前移动两步,而慢......
  • VSCode实现Markdown用法
    Python学习黄俊人一、Markdown语法标题一级标题二级标题引用引用一段话列表无序列表列表1列表2列表3有序列表嵌套TodoListab表格左对齐居中对齐右对齐abc段落换行?——两个以上空格后回车/空一行分割线——......
  • SCI一区级 | Matlab实现BO-Transformer-GRU多特征分类预测/故障诊断
    SCI一区级|Matlab实现BO-Transformer-GRU多特征分类预测/故障诊断目录SCI一区级|Matlab实现BO-Transformer-GRU多特征分类预测/故障诊断效果一览基本介绍程序设计参考资料效果一览基本介绍1.【SCI一区级】Matlab实现BO-Transformer-GRU特征分类预测......
  • JCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故
    JJCR一区|Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断目录JJCR一区|Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNN-MATTGASF-CNNGADF-CNN基本介绍程序设计参考......
  • Linux系统部署MongoDB开源文档型数据库并实现无公网IP远程访问
    个人名片......
  • 昇思25天学习打卡营第9天|应用实践之基于MindSpore实现的红酒分类实验
    基本介绍    今日要学习的是使用KNN算法进行红酒分类,实践是基于MindSpore平台的,采用模式识别著名的数据集之一,WineDataSet数据集。今日所学习的并不难,KNN是一个很成熟的算法了,网上教程很多,使用MindSpore的API可以很快速的搭建出KNN算法,而且数据集无需做额外的处理,简......
  • 昇思25天学习打卡营第8天|应用实践之基于 MindSpore 实现 BERT 对话情绪识别
    BERT模型基本介绍    昨天体验实践的模型是自然语言处理领域的模型,今天也是一样的。昨天的MusicGen是LLM模型,使用的是基于transformer的编码-解码器架构,而今天的BERT是基于transformer的双向编码器架构。由于主要目的是体验实践使用MindSpore运行BERT模型,所以只对BER......