LRU算法

打印 上一主题 下一主题

主题 1733|帖子 1733|积分 5199

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. package LRU缓存;
  2. import java.util.Arrays;
  3. import java.util.HashMap;
  4. //建立一个双向队列
  5. class MyQueueNode{
  6.     int key;
  7.     int value;
  8.     MyQueueNode pre;
  9.     MyQueueNode next;
  10.     public MyQueueNode(int key,int value){
  11.         this.key = key;
  12.         this.value=value;
  13.     }
  14. }
  15. class MyQueue{
  16.     MyQueueNode head;
  17.     MyQueueNode tail;
  18.     public MyQueue(){
  19.         head=new MyQueueNode(-1,-1);
  20.         tail=new MyQueueNode(-1,-1);
  21.         head.next=tail;
  22.         tail.pre=head;
  23.     }
  24. }
  25. //最近最少使用
  26. public class LRUCache {
  27.     int capacity;
  28.     MyQueue myQueue;
  29.     HashMap<Integer, MyQueueNode> hashMap;
  30.     public LRUCache(int capacity) {
  31.         this.capacity=capacity;
  32.         myQueue=new MyQueue();
  33.         hashMap = new HashMap<>();
  34.     }
  35.     public int get(int key) {
  36.         if (!hashMap.containsKey(key)){
  37.             return -1;
  38.         }
  39.         MyQueueNode node = hashMap.get(key);
  40.         //已经使用了要将这个节点插入至队列的末尾
  41.         removeNode(node);
  42.         insertIntoTail(node);
  43.         return node.value;
  44.     }
  45.     //更换至末尾
  46.     public void insertIntoTail(MyQueueNode node) {
  47.         node.pre=myQueue.tail.pre;
  48.         myQueue.tail.pre.next=node;
  49.         node.next=myQueue.tail;
  50.         myQueue.tail.pre=node;
  51.     }
  52.     public void removeNode(MyQueueNode node){
  53.         node.next.pre=node.pre;
  54.         node.pre.next=node.next;
  55.     }
  56.     public void put(int key, int value) {
  57.         if (get(key)!=-1){
  58.             //存在
  59.             hashMap.get(key).value=value;
  60.         }else{
  61.             //超过容量 移除头节点
  62.             if (hashMap.size()>=capacity){
  63.                 MyQueueNode node = myQueue.head.next;
  64.                 hashMap.remove(node.key);
  65.                 removeNode(myQueue.head.next);
  66.             }
  67.             //新增节点
  68.             MyQueueNode newNode = new MyQueueNode(key,value);
  69.             hashMap.put(key,newNode);
  70.             insertIntoTail(newNode);
  71.         }
  72.     }
  73. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表