LRU缓存结构【C语言】

这篇具有很好参考价值的文章主要介绍了LRU缓存结构【C语言】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include <stdio.h>
#include <stdlib.h>

//双链表节点结构
typedef struct Node {
	int key;
	int value;
	struct Node* pre;
	struct Node* next;
} Node;

//LRU结构
typedef struct 
{
	int capacity;
	struct Node* head;
	struct Node* tail;
	struct Node** cache;
}LRUCache;

//创建新节点
Node* createNode(int key, int value)
{
	Node* newNode = (Node*)malloc(sizeof(Node));
	newNode->key = key;
	newNode->value = value;
	newNode->pre = NULL;
	newNode->next = NULL;
	return newNode;
}

//创建LRU缓存
LRUCache* creatLRUCache(int capacity)
{
	LRUCache* cache = (LRUCache*)malloc(sizeof(LRUCache));
	cache->capacity = capacity;
	cache->head = createNode(0, 0);
	cache->tail = createNode(0, 0);
	cache->head->next = cache->tail;
	cache->tail->pre = cache->head;

	cache->cache = (Node**)malloc(sizeof(Node*)*100001);
	for (int i = 0; i < 100001; i++)
	{
		cache->cache[i] = NULL;
	}
	return cache;
}

//删除节点
void deleteNode(Node* node)
{
	node->pre->next = node->next;
	node->next->pre = node->pre;
}

//插入节点到头部
void insertToHead(Node* node, Node* head)
{
	node->next = head->next;
	node->pre = head;
	head->next = node;
	node->next->pre = node;
}

int getLRUCacheValue(LRUCache* obj, int key)
{
	if (obj->cache[key] != NULL)
	{
		Node* node = obj->cache[key];
		deleteNode(node);
		insertToHead(node, obj->head);
		return node->value;
	}
	return -1;
}

void setLRUCacheValue(LRUCache* obj, int key, int value)
{
	if (obj->cache[key] != NULL)
	{
		Node* node = obj->cache[key];
		node->value = value;
		deleteNode(node);
		insertToHead(node, obj->head);
	}
	else
	{
		Node* newNode = createNode(key, value);
		obj->cache[key] = newNode;
		insertToHead(newNode, obj->head);
		if(obj->capacity-- == 0)
		{
			Node* tail = obj->tail->pre;
			deleteNode(tail);
			obj->cache[tail->key] = NULL;
			free(tail);
			obj->capacity++;
		}
	}
}

//释放内存
void LRUCacheFree(LRUCache* obj)
{
	for (int i = 0; i < 100001; i++)
	{
		if (obj->cache[i] != NULL)
		{
			free(obj->cache[i]);
		}
	}
	free(obj->cache);
	free(obj->head);
	free(obj->tail);
	free(obj);
}

int main()
{
	LRUCache* obj = creatLRUCache(2);
	setLRUCacheValue(obj, 1, 1);
	setLRUCacheValue(obj, 2, 2);
	printf("%d\n", getLRUCacheValue(obj, 1));
	setLRUCacheValue(obj, 3, 3);
	printf("%d\n", getLRUCacheValue(obj, 2));
	setLRUCacheValue(obj, 4, 4);
	printf("%d\n", getLRUCacheValue(obj, 1));
	printf("%d\n", getLRUCacheValue(obj, 3));
	printf("%d\n", getLRUCacheValue(obj, 4));
	LRUCacheFree(obj);
	system("pause");
	return 0;
}

LRU缓存结构【C语言】,算法题目,缓存,c语言,开发语言
参考:https://blog.csdn.net/Conner7/article/details/136572016文章来源地址https://www.toymoban.com/news/detail-848815.html

到了这里,关于LRU缓存结构【C语言】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存)

    LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。 Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间来放新内容。LRU Cache 的替换原则就是将最近最少使用的内容替换掉。

    2024年02月03日
    浏览(42)
  • LRU 缓存结构

    优先去除最久没有访问到的数据。 通过组合哈希表(Hash Table)和双向链表(Doubly Linked List)实现 LRU 缓存。并且以 O(1) 的时间复杂度执行 get 和 put 操作 核心是对节点的新增、访问都会让节点移动到双向链表头部,当容量超过时,直接删除尾部节点即可

    2024年02月15日
    浏览(47)
  • 【算法】用JAVA代码实现LRU 【缓存】【LRU】

    LRU(Least Recently Used)是一种常见的缓存淘汰策略,用于在缓存空间不足时确定哪些数据应该被淘汰。其基本原则是淘汰最近最少被访问的数据。 工作原理 : 最近使用优先 : LRU算法基于这样的思想:最近被使用的数据很可能在短时间内还会被使用,因此保留这些数据有助于

    2024年01月23日
    浏览(45)
  • LRU 缓存淘汰算法

    Least Recently Used(LRU) 是缓存淘汰一种常用的策略,内存满了则优先删除最久没被使用的数据。 接收一个参数 capacity 作为缓存的最大容量 实现一个函数 put() 添加数据到缓存 实现一个函数 get() 查询缓存中的数据 以上函数应该在 (O(1)) 的时间内完成 满足以上需求的数据结构 —

    2024年02月11日
    浏览(57)
  • 面试遇到算法题:实现LRU缓存

    请你设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构。 这是一道大厂面试高频出现的算法题,难度为⭐️⭐️⭐️,属于中等,老铁们来一起看看这个题该怎么解? 没有废话,翠花,上酸菜! 为了实现一个满足 LRU (最近最少使用)缓存约束的数据结构,我们需

    2024年04月25日
    浏览(40)
  • Python算法题集_LRU 缓存

    本文为Python算法题集之一的代码示例 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果 key 存在于缓存中,则返回的值,否则返回 -1 。 void put(int

    2024年02月21日
    浏览(41)
  • 如何用链表实现LRU缓存淘汰算法

    缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存、数据库缓存、浏览器缓存 等等 大小有限,当缓存被用满时,哪些数据应该被清理掉,哪些数据又应该保留呢? 先进先出策略 FIFO 最少使用策略 LFU 最近最少使用策略

    2024年02月01日
    浏览(58)
  • 【设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构】

    LRU是Least Recently Used的缩写,意为最近最少使用。它是一种缓存淘汰策略,用于在缓存满时确定要被替换的数据块。LRU算法认为,最近被访问的数据在将来被访问的概率更高,因此它会优先淘汰最近最少被使用的数据块,以给新的数据块腾出空间。 如图所示: 先来3个元素进入

    2024年01月24日
    浏览(43)
  • 【设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构】

    LRU是Least Recently Used的缩写,意为最近最少使用。它是一种缓存淘汰策略,用于在缓存满时确定要被替换的数据块。LRU算法认为,最近被访问的数据在将来被访问的概率更高,因此它会优先淘汰最近最少被使用的数据块,以给新的数据块腾出空间。 如图所示: 先来3个元素进入

    2024年01月21日
    浏览(55)
  • LRU算法与Caffeine、Redis中的缓存淘汰策略

    在现代计算机系统中,缓存是提高系统性能的关键技术之一。为了避免频繁的IO操作,常见的做法是将数据存储在内存中的缓存中,以便快速访问。然而,由于内存资源有限,缓存的大小是有限的,因此需要一种策略来淘汰缓存中的数据,以便为新的数据腾出空间。本文将介

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包