当前位置:   article > 正文

LFU算法

lfu算法

1,基本原理

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

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

具体实现如下:

 

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

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

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

2,代码

  1. /*************************************************************************
  2. > File Name: Lfu.cpp
  3. > Author:zhangtx
  4. > Mail: zhangtx@jinher.com
  5. > Created Time: 2018年03月30日 星期五 15时50分24秒
  6. ************************************************************************/
  7. #include <map>
  8. #include <iostream>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <sys/time.h>
  12. using namespace std;
  13. class LFUCache {
  14. public:
  15. /*
  16. * @param capacity: An integer
  17. */LFUCache(int capacity) {
  18. // do intialization if necessary
  19. m_capacity=capacity;
  20. m_count = 0;
  21. }
  22. void remove_least_used_key()
  23. {
  24. map<int,int>::iterator iterBegin=m_countMap.begin();
  25. map<int,int>::iterator pos =iterBegin;
  26. for(;iterBegin!=m_countMap.end();iterBegin++)
  27. {
  28. if (pos->second>iterBegin->second)
  29. {
  30. pos=iterBegin;
  31. }
  32. else if (pos->second==iterBegin->second)
  33. {
  34. if (m_keytotime[pos->first]>m_keytotime[iterBegin->first])
  35. {
  36. pos=iterBegin;
  37. }
  38. }
  39. }
  40. cout<<endl<<"remove "<<pos->first<<endl;
  41. m_dataMap.erase(m_dataMap.find(pos->first));
  42. m_keytotime.erase(m_keytotime.find(pos->first));
  43. m_countMap.erase(pos);
  44. m_count--;
  45. }
  46. /*
  47. * @param key: An integer
  48. * @param value: An integer
  49. * @return: nothing
  50. */
  51. void set(int key, int value) {
  52. // write your code here
  53. if (m_countMap.find(key) != m_countMap.end())
  54. {
  55. m_countMap[key]=m_countMap[key]+1;
  56. m_dataMap[key]=value;
  57. }
  58. else
  59. {
  60. if ((m_count>=m_capacity))
  61. {
  62. remove_least_used_key();
  63. }
  64. m_countMap[key]=1;
  65. m_dataMap[key]=value;
  66. m_count++;
  67. }
  68. struct timezone tz;
  69. struct timeval tv;
  70. gettimeofday (&tv , &tz);
  71. m_keytotime[key]=tv.tv_sec*1000000+tv.tv_usec;
  72. }
  73. /*
  74. * @param key: An integer
  75. * @return: An integer
  76. */
  77. int get(int key) {
  78. // write your code here
  79. if (m_dataMap.find(key)!=m_dataMap.end())
  80. {
  1. struct timezone tz;
  2. struct timeval tv;
  3. gettimeofday (&tv , &tz);
  4. m_keytotime[key]=tv.tv_sec*1000000+tv.tv_usec;
  5. m_countMap[key]=m_countMap[key]+1;
  6. return m_dataMap[key];
  7. }
  8. else
  9. return -1;
  10. }
  11. private:
  12. int m_capacity;
  13. int m_count;
  14. map<int,int> m_dataMap;
  15. map<int,int> m_countMap;
  16. map<int,long> m_keytotime;
  17. };
  18. int main(int argc,char *argv[])
  19. {
  20. cout<<endl;
  21. cout<<endl;
  22. LFUCache *lfu=new LFUCache(3);
  23. lfu->set(1,10);
  24. lfu->set(2,20);
  25. lfu->set(3,30);
  26. cout<<lfu->get(1)<<" ";
  27. lfu->set(4, 40);
  28. cout<<lfu->get(4)<<" ";
  29. cout<<lfu->get(3)<<" ";
  30. cout<<lfu->get(2)<<" ";
  31. cout<<lfu->get(1)<<" ";
  32. lfu->set(5, 50);
  33. cout<<lfu->get(1)<<" ";
  34. cout<<lfu->get(2)<<" ";
  35. cout<<lfu->get(3)<<" ";
  36. cout<<lfu->get(4)<<" ";
  37. cout<<lfu->get(5)<<" ";
  38. delete lfu;
  39. cout<<endl;
  40. cout<<endl;
  41. cout<<endl;
  42. }

lfu

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/950825
推荐阅读
相关标签
  

闽ICP备14008679号