码迷,mamicode.com
首页 > 编程语言 > 详细

LRU算法之hash+list实现(转)

时间:2015-03-30 10:51:49      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

LRU主要的耗时操作就是查找,因此,我们可以使用hash_map来代替map,因此时间复杂度可以从O(logN)降低到O(1)

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

class LRUCache{
public:
    LRUCache(int capacity) {
        m_capacity = capacity ;
    }

    int get(int key) {
        int retValue = -1 ;
        map<int, list<pair<int, int> > :: iterator> ::iterator it = cachesMap.find(key) ;

         //如果在Cashe中,将记录移动到链表的最前端
        if (it != cachesMap.end())
        {
            retValue = it ->second->second ;
            //移动到最前端
            list<pair<int, int> > :: iterator ptrPair = it -> second ;
            pair<int, int> tmpPair = *ptrPair ;
            caches.erase(ptrPair) ;
            caches.push_front(tmpPair) ;

            //修改map中的值
            cachesMap[key] = caches.begin() ;
        }
        return retValue ;

        
    }

    void set(int key, int value) {

        map<int, list<pair<int, int> > :: iterator> ::iterator it = cachesMap.find(key) ;

        if (it != cachesMap.end()) //已经存在其中
        {
             list<pair<int, int> > :: iterator ptrPait = it ->second ;
            ptrPait->second = value ;
            //移动到最前面
            pair<int , int > tmpPair = *ptrPait ;
            caches.erase(ptrPait) ;
            caches.push_front(tmpPair) ;

            //更新map
            cachesMap[key] = caches.begin() ;
        }
        else //不存在其中
        {
            pair<int , int > tmpPair = make_pair(key, value) ;

            if (m_capacity == caches.size()) //已经满
            {
                int delKey = caches.back().first ;
                caches.pop_back() ; //删除最后一个

                //删除在map中的相应项
                map<int, list<pair<int, int> > :: iterator> ::iterator delIt = cachesMap.find(delKey) ;
                cachesMap.erase(delIt) ;
            }

            caches.push_front(tmpPair) ;
            cachesMap[key] = caches.begin() ; //更新map
        }
    }

private:
    int m_capacity ;                                                                        //cashe的大小
    list<pair<int, int> > caches ;                                                    //用一个双链表存储cashe的内容
    map< int, list<pair<int, int> > :: iterator> cachesMap ;            //使用map加快查找的速度
};

int main(int argc, char **argv)
{
    LRUCache s(2) ;
    s.set(2, 1) ;
    s.set(1, 1) ;
    cout << s.get(2) << endl;
    s.set(4, 1) ;
    cout << s.get(1) << endl;
    cout << s.get(2) << endl;
    return 0 ;
}

原文链接:http://blog.csdn.net/doufei_ccst/article/details/23094987 

LRU算法之hash+list实现(转)

标签:

原文地址:http://www.cnblogs.com/sanfeng/p/4377208.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!