程序员面试金典 16.25

本文介绍了一种高效实现LRU(最近最少使用)缓存的方法,通过结合链表和散列表的数据结构,实现了快速查找和更新最近最少使用的项。在缓存满时,能快速剔除最不常用的项,保持缓存的有效性和高性能。

LRU Cache:设计并实现一个LRU的缓存。

为了较快的命中缓存,一般对键值key进行散列运算,但是找到最近最少使用项需要O(N)的时间。为了较快的找到最近最少使用项,可以基于最近使用的频率,对缓存行进行排序,但是这又导致无法快速找到某一缓存行。

所以我们应该同时使用上述两种数据结构,使用链表将缓存行串起来,同时利用散列表进行查找。当缓存满时,剔除链表中最后的一项,每当访问或者添加新的缓存行时,将命中项移动到链表头部。

class LRUCache {
private:
    struct CacheLine
    {
        int key, value;
        shared_ptr<CacheLine> prev, next;
        CacheLine(int k, int v) : key(k), value(v){}
    };
    size_t MaxCapacity;
    unordered_map<int, shared_ptr<CacheLine>> Cache;
    shared_ptr<CacheLine> Head, Tail;
public:
    LRUCache(int capacity) {
        MaxCapacity = static_cast<size_t>(capacity);
        Head = make_shared<CacheLine>(CacheLine(0, 0));
        Tail = make_shared<CacheLine>(CacheLine(0, 0));
        Head->next = Tail;
        Tail->prev = Head;
    }
    
    int get(int key) {
        auto iter = Cache.find(key);
        if(iter != Cache.end()){
            shared_ptr<CacheLine> cl = iter->second;
            cl->prev->next = cl->next;
            cl->next->prev = cl->prev;
            cl->prev = Head;
            cl->next = Head->next;
            Head->next->prev = cl;
            Head->next = cl;
            return cl->value;
        }
        else return -1;
    }
    
    void put(int key, int value) {
        if(get(key) != -1){
            Cache[key]->value = value;
        }
        else{
            if(Cache.size() == MaxCapacity){
                int EvictedKey = Tail->prev->key;
                Cache.erase(EvictedKey);
                shared_ptr<CacheLine> last = Tail->prev;
                last->prev->next = Tail;
                Tail->prev = last->prev;
                last = nullptr;
            }
            shared_ptr<CacheLine> first = make_shared<CacheLine>(key, value);
            first->next = Head->next;
            first->prev = Head;
            Head->next->prev = first;
            Head->next = first;
            Cache[key] = first;
        }
    }
};

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache* obj = new LRUCache(capacity);
 * int param_1 = obj->get(key);
 * obj->put(key,value);
 */
内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值