zoukankan      html  css  js  c++  java
  • 算法: 实现LRU缓存,读取、写入O(1)实现

    这题应该见的不少了,写写记录一下。

    实现该功能分析:

    (1) O(1) 时间完成查找,那除了 hash 别无选择。

    (2) LRU 最近最少使用算法,为了方便数据的淘汰。需要对最近访问的数据放未访问数据之前。

         用双向链表实现即可。(通常情况下,双向链表读取、插入的时间复杂度都是O(n), 但是如果知道插入位置,则可以实现O(1)实现。)

    实现: hash存key对应的数据在双向链表中的位置,就可以完成该功能。

    具体代码:

     1 #include <iostream>
     2 #include <list> //std::list双向链表实现
     3 #include <map>
     4 
     5 const int MAX_VALUE_LEN = 32;
     6 const int MAX_ELEMENT_NUM = 3;
     7 
     8 struct CacheNode{
     9     int key;
    10     int len;
    11     char data[MAX_VALUE_LEN];
    12 };
    13 
    14 class LRU{
    15 public:
    16     //默认10个原始
    17     LRU(int max_num = MAX_ELEMENT_NUM);
    18     ~LRU();
    19 
    20     //数据获取
    21     bool get(const int key, char *data, int &len);
    22 
    23     //新增数据
    24     bool set(const int key, const char* data, const int len);
    25 
    26     //打印数据
    27     void print_list();
    28 private:
    29    
    30     //更新节点的链接
    31     //访问元素后, 需要将元素放置在list 头部
    32     int update_node_link(const int key);
    33 
    34     int _max_num;
    35     std::list<CacheNode*> _list;
    36     std::map<int, std::list<CacheNode*>::iterator> _map;
    37 };
  • 相关阅读:
    16/3/16 实验回顾总结
    学习进度条
    实验一 命令解释程序的编写
    了解和熟悉操作系统
    0302思考并回答一些问题
    一个礼拜开发出一个栏目(总结/反思)
    如何获取继承中泛型T的类型
    用js判断页面是否加载完成
    读取文件之<绝对路径>与<相对路径>
    JSON--List集合转换成JSON对象
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/7670673.html
Copyright © 2011-2022 走看看