LFU缓存

LFU缓存题目描述设计并实现最不经常使用 LFU 缓存的数据结构 它应该支持以下操作 get 和 put get key 如果键存在于缓存中 则获取键的值 总是正数 否则返回 1 put key value 如果键不存在 请设置或插入值 当缓存达到其容量时 它应该在插入新项目之前 使最不经常使用的项目无效 在此问题中 当存在平局 即两个或更多个键具有相同使用频率 时 最近最少使

题目描述

设计并实现最不经常使用(LFU)缓存的数据结构。它应该支持以下操作:get 和 put。

 示例

LFUCache cache = new LFUCache( 2 /* capacity (缓存容量) */ );

 思路:

LFU的节点采用双链表结构进行存储,利用两个hash_map分别存储节点数据以及每个节点访问的频率。

struct List_node{ int key, value; int count; int size; List_node *next, *prev; }; void list_add_after(List_node* prev_node, List_node* node) { prev_node->next->prev = node; node->next = prev_node->next; node->prev = prev_node; prev_node->next = node; } List_node* list_remove(List_node* node) { node->prev->next = node->next; node->next->prev = node->prev; node->prev = node->next = node; return node; } List_node* list_create() { List_node* node = new List_node(); node->next = node->prev = node; return node; } void count_hash_table_add_node(unordered_map 
  
    & count_hash_table, List_node* node) { if (count_hash_table.find(node->count) == count_hash_table.end()) { count_hash_table.insert(make_pair(node->count, node)); node->size = 1; return; } List_node* head = count_hash_table.find(node->count)->second; list_add_after(head->prev, node); head->size++; } void count_hash_table_remove_node(unordered_map 
   
     & count_hash_table, List_node* node) { List_node* head = count_hash_table.find(node->count)->second; if (head->size != 1) { if (head == node) { count_hash_table[head->count] = head->next; head->next->size = head->size - 1; } else { head->size = head->size - 1; } list_remove(node); node->size = 0; } else { list_remove(node); node->size = 0; count_hash_table.erase(node->count); } } class LFUCache { public: int _size; int _capacity; int min_count; unordered_map 
    
      key_hash_table; unordered_map 
     
       count_hash_table; LFUCache(int capacity) { _size = 0; _capacity = capacity; } int get(int key) { if (key_hash_table.find(key) == key_hash_table.end()) { return -1; } List_node* node = key_hash_table.find(key)->second; count_hash_table_remove_node(count_hash_table, node); if (min_count == node->count && count_hash_table.find(node->count) == count_hash_table.end()) { min_count = node->count + 1; } node->count++; count_hash_table_add_node(count_hash_table, node); return node->value; } void put(int key, int value) { if (get(key) != -1) { List_node* node = key_hash_table.find(key)->second; node->value = value; } else if (_size < _capacity) { List_node* node = list_create(); node->key = key; node->value = value; node->count = 0; node->size = 0; count_hash_table_add_node(count_hash_table, node); min_count = 0; _size++; key_hash_table.insert(make_pair(key, node)); } else if (_capacity > 0) { List_node* node = count_hash_table.find(min_count)->second; count_hash_table_remove_node(count_hash_table, node); key_hash_table.erase(node->key); node->key = key; node->value = value; node->count = 0; node->size = 0; count_hash_table_add_node(count_hash_table, node); min_count = 0; key_hash_table.insert(make_pair(key, node)); } } }; 
      
     
    
  

运行结果

LFU缓存

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227899.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午8:16
下一篇 2026年3月16日 下午8:16


相关推荐

  • Cursor debug 调试栏不见了怎么解决(toolbar missing)

    Cursor debug 调试栏不见了怎么解决(toolbar missing)

    2026年3月14日
    2
  • Java8 Stream groupingBy对List进行分组

    Java8 Stream groupingBy对List进行分组提到GroupBy,首先想到的往往是sql中的groupby操作,对搜索结果进行分组。其实Java8StreamsAPI中的Collector也支持流中的数据进行分组和分区操作,本片文章讲简单介绍一下,如何使用groupingBy和partitioningBy来对流中的元素进行分组和分区。 groupingBy 首先看一下Java8之前如果想对一个List做分组操作,我们需要…

    2022年8月20日
    13
  • idea激活码在哪输入2022【2022.01最新】2022.02.03

    (idea激活码在哪输入2022)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlCJ…

    2022年3月31日
    232
  • 关于光模块用单模光纤和多模光纤小知识

    关于光模块用单模光纤和多模光纤小知识通过对光纤的认知 我们了解到光纤是通过导光来传输信号 不导电 不怕雷击 所以也不需要用接地保护 我们按光在光纤中的传输模式分为 多模光纤和单模光纤 对于我们使用者来说 你把多模和单模名称由来记住就可以了 接下来就由飞畅科技的小编来为大家详细介绍下单模光纤和多模光纤 一起来看看吧 多模光纤 可以传输多种模式的光 单模光纤 只能传输一种模式的光 多模光纤传输的距离比较近 通常单模光纤传输距离可以达到多模光纤的几十倍 单模价格一般比多模光纤价格贵 使用光纤的优势还包括 1 当信息点传输距离大于

    2026年3月26日
    2
  • LAPACK库

    LAPACK库一 LAPACK 库的地址 LAPACK LinearAlgebr 库 是用 Fortran 语言编写的线性代数计算库 包含线性方程组求解 AX b 矩阵分解 矩阵求逆 求矩阵特征值 奇异值等 该库用 BLAS 库做底层运算 许多高层的数学库都用 BLAS 和 LAPACK 做底层 LAPACKiswrit

    2026年3月18日
    2
  • 网络交换机光口和电口_交换机的光口

    网络交换机光口和电口_交换机的光口 一、光口1、基本概念     光口是光纤接口的简称。   也可称之为:G口 (意思是G光纤口)   光口:所应用于机房,机柜等大型设备的一个光纤带宽接口。   光纤可以用于音频(声卡有光输出的),网络(光纤作为传输介质),磁盘(光纤代替电缆传输数据)等等。   光纤又可分为单模光纤和多模光纤区别如下:   单模光纤和多模光纤可以从纤芯的尺…

    2022年10月21日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号