LFU算法

1,基本原理

LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。

LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。

具体实现如下:
LFU算法_第1张图片

 

1. 新加入数据插入到队列尾部(因为引用计数为1);

2. 队列中的数据被访问后,引用计数增加,队列重新排序;

3. 当需要淘汰数据时,将已经排序的列表最后的数据块删除。

2,代码

/*************************************************************************
    > File Name: Lfu.cpp
    > Author:zhangtx
    > Mail: [email protected] 
    > Created Time: 2018年03月30日 星期五 15时50分24秒
 ************************************************************************/
#include 
#include 
#include 
#include 
#include 
using namespace std;
class LFUCache {
public:
    /*
    * @param capacity: An integer
    */LFUCache(int capacity) {
        // do intialization if necessary
        m_capacity=capacity;
        m_count = 0;
    }

    void remove_least_used_key()
    {
        map::iterator iterBegin=m_countMap.begin();
        map::iterator pos      =iterBegin;
        for(;iterBegin!=m_countMap.end();iterBegin++)
        {
            if (pos->second>iterBegin->second)
            {
		pos=iterBegin;
            }
	    else if (pos->second==iterBegin->second)
	    {
		if (m_keytotime[pos->first]>m_keytotime[iterBegin->first])
	        {
		     pos=iterBegin;
		}
	    }
        }
	cout<first<first));
	m_keytotime.erase(m_keytotime.find(pos->first));
        m_countMap.erase(pos);
        m_count--;
        
    }

    /*
     * @param key: An integer
     * @param value: An integer
     * @return: nothing
     */
    void set(int key, int value) {
        // write your code here
        if (m_countMap.find(key) != m_countMap.end())
        {
            m_countMap[key]=m_countMap[key]+1;
	    m_dataMap[key]=value;
        }
        else
        {
            if ((m_count>=m_capacity))
            {
                remove_least_used_key();
            }
            m_countMap[key]=1;
            m_dataMap[key]=value;
            m_count++;
        }
	struct timezone tz;
	struct timeval tv;
	gettimeofday (&tv , &tz);
	m_keytotime[key]=tv.tv_sec*1000000+tv.tv_usec;
    }

    /*
     * @param key: An integer
     * @return: An integer
     */
    int get(int key) {
        // write your code here
        if (m_dataMap.find(key)!=m_dataMap.end())
        {		
             struct timezone tz;
	     struct timeval tv;
	     gettimeofday (&tv , &tz);
	     m_keytotime[key]=tv.tv_sec*1000000+tv.tv_usec;
			
	     m_countMap[key]=m_countMap[key]+1;
             return m_dataMap[key];
        }
        else
            return -1;
    }
private:
    int m_capacity;
    int m_count;
    map m_dataMap;
    map m_countMap;
    map m_keytotime;
    
};
int main(int argc,char *argv[])
{
	cout<set(1,10);
	lfu->set(2,20);
	lfu->set(3,30);
	cout<get(1)<<" ";
	lfu->set(4, 40);
	cout<get(4)<<" ";
	cout<get(3)<<" ";
	cout<get(2)<<" ";
	cout<get(1)<<" ";
        lfu->set(5, 50);
	cout<get(1)<<" ";
	cout<get(2)<<" ";
	cout<get(3)<<" ";
	cout<get(4)<<" ";
	cout<get(5)<<" ";
	delete lfu;

	cout<

lfu

你可能感兴趣的:(常用算法,缓存淘汰,lfu)