算法学习 - LRUCache学习(C++)

LRUCache解释

LRUCache就是一个缓存系统,主要是在操作系统中用的比较多,我这里实现的仅仅是一个简单的方法,原理是正确的,但是操作系统的内部的缓存代码我并没有看过。

LRU是Least Recently Used的意思,Cache大家都知道是缓存的意思了。就是在缓存里保存最近最常使用的元素,这样访问这些元素的时候,速度就比较快的能访问到了。

缓存里存放的一般都是键值对,就是(key, value)的结构,大致最简单的就是有两种操作:

  1. 一种是get(key),这个方法是从缓存里查找是否有key的元素,有的话返回其value值,没有的话返回-1
  2. 一种是set(key , value),这个方法是假如缓存里没有key的元素,那么放到缓存里,假如缓存已经满了,把最不常用的那个(key,
    value)给扔掉,再把新元素放进去。假如缓存里已经有key的元素了,那么更新keyvalue值。

代码实现

大家应该都明白这是一个什么系统了,下面放上我的代码实现:

//
//  main.cpp
//  LRUCache
//
//  Created by Alps on 14/12/5.
//  Copyright (c) 2014年 chen. All rights reserved.
//

#include <iostream>
#include <map>
using namespace std;

class LRUCache{
public:
    struct Node{
        int key;
        int value;
        Node* next;
        Node* pre;
        Node(int k, int v):key(k), value(v), next(NULL), pre(NULL){}
    };
    int maxsize;
    int cursize;
    typedef Node* Keynode;
    map<int ,Keynode> cachemap;
    Keynode head;
    Keynode tail;
    LRUCache(int capacity) {
        head = new Node(-1,-1);
        tail = new Node(-1,-1);
        head->next = tail;
        tail->pre = head;
        maxsize = capacity;
        cursize = 0;
    }

    void insertHead(Keynode node){
        node->next = head->next;
        node->pre = head;
        head->next->pre = node;
        head->next = node;
    }

    void deleteNode(Keynode node){
        node->pre->next = node->next;
        node->next->pre = node->pre;
    }

    int get(int key) {
        map<int, Keynode>::iterator iter;
        iter = cachemap.find(key);
        if (iter == cachemap.end()) {
            return -1;
        }else{
            Keynode temp = iter->second;
            deleteNode(temp);
            insertHead(temp);
            return temp->value;
        }
        return -1;
    }

    void set(int key, int value) {
        map<int, Keynode>::iterator iter;
        iter = cachemap.find(key);
        if (iter == cachemap.end()) {
            if (cursize >= maxsize) {
                Keynode freenode = tail->pre;
                cachemap.erase(freenode->key);
                deleteNode(freenode);
                free(freenode);
                Keynode temp = (Keynode)malloc(sizeof(struct Node));
                *temp = Node(key,value);
                insertHead(temp);
                cachemap[key] = temp;
            }else{
                Keynode temp = (Keynode)malloc(sizeof(struct Node));
                *temp = Node(key,value);
                insertHead(temp);
                cursize++;
                cachemap[key] = temp;
            }
        }else{
            Keynode temp = iter->second;
            temp->value = value;
            deleteNode(temp);
            insertHead(temp);
        }
    }
};

int main(int argc, const char * argv[]) {
    LRUCache L(2);
    L.set(2, 1);
    L.set(2, 2);
    int v = L.get(2);
    L.set(1, 1);
    L.set(4, 1);

    printf("%d\n",v);
    printf("%d\n",L.get(2));
    return 0;
}
时间: 2024-10-08 18:42:20

算法学习 - LRUCache学习(C++)的相关文章

数据结构与算法C++描述学习笔记1、辗转相除——欧几里得算法

前面学了一个星期的C++,以前阅读C++代码有些困难,现在好一些了.做了一些NOI的题目,这也是一个长期的目标中的一环.做到动态规划的相关题目时发现很多问题思考不通透,所以开始系统学习.学习的第一本是<数据结构与算法C++描述>第三版,边学边做一些笔记.所以这些笔记中的代码有很多将会非常简单,甚至可能只有一个记录或者结论. 辗转相除法用来求两个整数的最大公约数,即能同时整除两个数的最大整数.程序如下: int gdc(int m,int n){ int rem; while(n!=0){ //

【算法导论】学习笔记——第6章 堆排序

堆这个数据结构应用非常广泛,数字图像处理的算法里也见过.似乎记得以前老师上课说需要用树结构实现堆排序,看了一下算法导论才明白其精髓.堆虽然是一棵树,但显然没必要非得用树结构实现堆排序.堆排序的性质很好,算法时间复杂度为O(nlgn). 1. 堆排序的简要说明.二叉堆可以分为两种形式:最大堆和最小堆.在最大堆中,最大堆性质是指除了根以外的所有结点i都要满足: A[PARENT(i)] >= A[i]:在最小堆中,最小堆性质是指除了根以外的所有结点i都要满足: A[PARENT(i)] <= A[

Netflix工程总监眼中的分类算法:深度学习优先级最低

Netflix工程总监眼中的分类算法:深度学习优先级最低 摘要:不同分类算法的优势是什么?Netflix公司工程总监Xavier Amatriain根据奥卡姆剃刀原理依次推荐了逻辑回归.SVM.决策树集成和深度学习,并谈了他的不同认识.他并不推荐深度学习为通用的分类技术. [编者按]针对Quora上的一个老问题:不同分类算法的优势是什么?Netflix公司工程总监Xavier Amatriain近日给出新的解答,他根据奥卡姆剃刀原理依次推荐了逻辑回归.SVM.决策树集成和深度学习,并谈了他的不同

关于校验算法的学习(学习以太网时遇到的)

关于校验算法的学习(学习以太网时遇到的)以太网的包头还是数据都会有校验,在FPGA上实现IP核时,用的是CRC校验,然后学习ICMP协议时,也看到一种校验算法,以此学习分析一下背后原理. 一.先看看ICMP的包格式,主要是写ping命令是用到(会有一篇专门将ping的c语言实现),所以只是展示与ping命令背后的ICMP规则. (来自维基) 对于校验的研究暂时不需要理解其他数据的意思,维基对checksum的解释为 Checksum Error checking data, calculated

Python神经网络算法与深度学习视频教程人工智能算法机器学习实战视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

【机器学习算法应用和学习_2_理论篇】2.2 M_分类_逻辑回归

一.原理阐述 算法类型:监督学习_分类算法 输入:数值型或标称型(标称型需要独热编码) V1.0 用回归方式解决二分类问题,通过引入一个Sigmoid函数将中间y值映射到实际二分类的y值上. 二.算法选择 三.算法过程 1.Sigmoid函数是一个x值域是(-∞,+∞),y值域是(0,1)的单调递增函数: 2.预测y值>0.5为1类,<0.5为0类,y值也可以解释为为1和0类的概率: 3.同样使用“最小二乘”概念,求得最佳方程,得到目标函数: 4.要使得目标函数达到最小,需要采用一种称为“梯度

Python3入门机器学习经典算法与应用学习 资源

 Python3入门机器学习经典算法与应用学习 资源 datasets可以用来加载真实数据进行模型训练的测试 import sklearn.datasetsdatasets.load_iris() # 用于加载鸢尾花数据集datasets.load_digits() # 用于加载手写识别的数据集datasets.load_boston() #  用于加载波士顿房价的数据集fetch_mldata用于加载MNIST数据集from sklearn.datasets import fetch_mlda

Deep Learning(深度学习)学习笔记整理系列七

Deep Learning(深度学习)学习笔记整理系列 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢. 4)阅读本文需要机器学习.计算机视觉.神经网络等等基础(如果没有也没关系了,没

Deep Learning(深度学习)学习笔记整理系列之(五)

Deep Learning(深度学习)学习笔记整理系列 [email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04-08 声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主