首页 > 编程语言 > 详细

LRU算法

时间:2020-09-09 11:07:12      阅读:70      评论:0      收藏:0      [点我收藏+]

https://blog.csdn.net/luoweifu/article/details/8297084

参考上方博主的思路,使用双向链表和hashMap来实现,但是觉得hashMap来回改,效率也没提升多少吧

整个输入以及过程可以参考上方博主给的思路,理解了!

如输入以下序列时:4,7,0,7,1,0,1,2,1,2,6

结果为:

4        
4        7        
4        7        0        
4        0        7        
4        0        7        1        
4        7        1        0        
4        7        0        1        
4        7        0        1        2        
4        7        0        2        1        
4        7        0        1        2        
7        0        1        2        6        

import java.util.HashMap;
import java.util.LinkedList;

public class LRU {
    public static void main(String[] args) {
        LRU lru = new LRU();
        int[] item=new int[]{4,7,0,7,1,0,1,2,1,2,6};
        for (int i = 0; i < item.length; i++) {
            lru.push(item[i]);
        }
        lru.showList();
    }
    //容量
    private int N=5;

    //存放数组
    private LinkedList<Object> lists=new LinkedList<>();
    private HashMap<Object,Integer> hashMap=new HashMap<>();

    private boolean isFull(){
        return lists.size()>=N;
    }

    //返回插入位置索引
    public int push(Object obj){
        if(hashMap.containsKey(obj)){
            int index=hashMap.get(obj);//找到这个key的索引
            for(int i=index;i<lists.size()-1;i++){
                lists.set(i,lists.get(i+1));
                hashMap.put(lists.get(i),hashMap.get(lists.get(i))-1);
            }
            lists.set(lists.size()-1,obj);
            hashMap.put(obj,lists.size()-1);
        }
        else {
            if(!isFull()){
                hashMap.put(obj,lists.size());//放入索引,因为要在现在的list上追加,索引为lists.size()-1+1
                lists.add(obj);
            }
            else {
                Object first=lists.getFirst();
                hashMap.remove(first);
                lists.removeFirst();
                lists.add(obj);
                for (int i = 0; i < lists.size(); i++) {
                    hashMap.put(lists.get(i),i);
                }
            }
        }
        return hashMap.get(obj);
    }

    public void showList(){
        for (int i = 0; i < lists.size(); i++) {
            System.out.print(lists.get(i)+" ");
        }
    }
}

 

LRU算法

原文:https://www.cnblogs.com/ningxinjie/p/13636956.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!