zoukankan      html  css  js  c++  java
  • LRU算法

    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)+" ");
            }
        }
    }

     //第二次写,这次不使用hashMap,因为调整它的性能感觉比使用它还要高:

    package test.suanfa;
    
    import java.util.HashMap;
    import java.util.LinkedList;
    
    public class LRU {
        public static void main(String[] args) {
            test.test.LRU lru = new test.test.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();
        }
        //capcity
        private int N=5;
        //curCapcity 其实我使用 list.size()也可以
        private int size=0;
        //存放 【对象->索引】(不用了,因为一旦某一个变化hash内部后面的全部需要变化,也没省性能,反而占空间)
        HashMap<Object,Integer> hashMap;
        //对象存在队列中
        private LinkedList list;
    
        public LRU(){
            list=new LinkedList();
            hashMap=new HashMap<>();
        }
    
        private void push(Object obj){
            if(size<5){
                int index=-1;
                for(int i=0;i<size;i++){
                    if(list.get(i).equals(obj)){
                        index=i;
                        break;
                    }
                }
                //判断是否存在
                if(index==-1){
                    list.add(obj);
                    size++;
                }
                else {
                    for(int i=index;i<size-1;i++){
                        list.set(i,list.get(i+1));
                    }
                    list.set(size-1,obj);
                }
            }
            else {
                list.removeFirst();
                list.add(obj);
            }
        }
        public void showList(){
            for (int i = 0; i < list.size(); i++) {
                System.out.print(list.get(i)+" ");
            }
        }
    }
  • 相关阅读:
    数据库课程设计心得【3】存储过程的运用
    看BBC研究大脑的科教片中“放松产生灵感”的笔记
    成功干掉“恶心的U盘自动运行病毒免疫目录”!共享方法,让更多的人干掉这东西!
    分享一大堆最新dot net asp.net c# 电子书下载 , 英文原版的。经典中的经典
    SQL学习之 对GROUP BY 和 HAVING 的理解 学习笔记
    关于Theme中.skin与css需要理清的关系
    最近的学习笔记,记录一些通俗易懂的学习类文章。更像是好资料参与索引。
    关于DNN Module开发学习以来的一点总结
    工具发布!QQ空间阅读与备份工具
    被忽视的大道理
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/13636956.html
Copyright © 2011-2022 走看看