首页 > 编程语言 >简单算法-1

简单算法-1

时间:2024-04-02 21:35:29浏览次数:25  
标签:System 算法 add key 简单 println public out


先来先淘汰(FIFO)


package com.itheima.release; import java.util.Iterator; import java.util.LinkedList; public class FIFO { LinkedList<Integer> fifo = new LinkedList<Integer>(); int size = 3; //添加元素 public void add(int i){ fifo.addFirst(i); if (fifo.size() > size){ fifo.removeLast(); } print(); } //缓存命中 public void read(int i){ Iterator<Integer> iterator = fifo.iterator(); while (iterator.hasNext()){ int j = iterator.next(); if (i == j){ System.out.println("find it!"); print(); return ; } } System.out.println("not found!"); print(); } //打印缓存 public void print(){ System.out.println(this.fifo); } //测试 public static void main(String[] args) { FIFO fifo = new FIFO(); System.out.println("add 1-3:"); fifo.add(1); fifo.add(2); fifo.add(3); System.out.println("add 4:"); fifo.add(4); System.out.println("read 2:"); fifo.read(2); System.out.println("read 100:"); fifo.read(100); System.out.println("add 5:"); fifo.add(5); } } 3)结果分析 image-20200604155855287 1-3按顺序放入,没有问题 4放入,那么1最早放入,被挤掉 读取2,读到,但是不会影响队列顺序(2依然是时间最老的) 读取100,读不到,也不会产生任何影响 5加入,踢掉了2,而不管2之前有没有被使用(不够理性)

最久未用淘汰(LRU)

package com.itheima.release;

import java.util.Iterator;
import java.util.LinkedList;

public class LRU {
    LinkedList<Integer> lru = new LinkedList<Integer>();
    int size = 3;
    //添加元素
    public void add(int i){
        lru.addFirst(i);
        if (lru.size() > size){
            lru.removeLast();
        }
        print();
    }
    //缓存命中
    public void read(int i){
        Iterator<Integer> iterator = lru.iterator();
        int index = 0;
        while (iterator.hasNext()){
            int j = iterator.next();
            if (i == j){
                System.out.println("find it!");
                lru.remove(index);
                lru.addFirst(j);
                print();
                return ;
            }
            index++;
        }
        System.out.println("not found!");
        print();
    }
    //打印缓存
    public void print(){
        System.out.println(this.lru);
    }
    //测试
    public static void main(String[] args) {
        LRU lru = new LRU();
        System.out.println("add 1-3:");
        lru.add(1);
        lru.add(2);
        lru.add(3);
        System.out.println("add 4:");
        lru.add(4);
        System.out.println("read 2:");
        lru.read(2);
        System.out.println("read 100:");
        lru.read(100);
        System.out.println("add 5:");
        lru.add(5);
    }
}

3)结果分析

image-20200604160326888

1-3加入,没有问题
4加入,踢掉1,没问题
读取2,读到,注意,2被移到了队首!
读取100,读不到,没影响
5加入,因为2之前被用到,不会被剔除,3和4都没人用,但是3更久,被剔除
 

最近最少使用(LFU)

package com.itheima.release;

public class Dto implements Comparable<Dto> {
    private Integer key;
    private int count;
    private long lastTime;

    public Dto(Integer key, int count, long lastTime) {
        this.key = key;
        this.count = count;
        this.lastTime = lastTime;
    }

    @Override
    public int compareTo(Dto o) {
        int compare = Integer.compare(this.count, o.count);
        return compare == 0 ? Long.compare(this.lastTime, o.lastTime) : compare;
    }

    @Override
    public String toString() {
        return String.format("[key=%s,count=%s,lastTime=%s]",key,count,lastTime);
    }

    public Integer getKey() {
        return key;
    }

    public void setKey(Integer key) {
        this.key = key;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public long getLastTime() {
        return lastTime;
    }

    public void setLastTime(long lastTime) {
        this.lastTime = lastTime;
    }
}
 

package com.itheima.release;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class LFU {
    private final int size = 3;

    private Map<Integer,Integer> cache = new HashMap<>();

    private Map<Integer, Dto> count = new HashMap<>();

    //投放
    public void put(Integer key, Integer value) {
        Integer v = cache.get(key);
        if (v == null) {
            if (cache.size() == size) {
                removeElement();
            }
            count.put(key, new Dto(key, 1, System.currentTimeMillis()));
        } else {
            addCount(key);
        }
        cache.put(key, value);
    }
    //读取
    public Integer get(Integer key) {
        Integer value = cache.get(key);
        if (value != null) {
            addCount(key);
            return value;
        }
        return null;
    }

    //淘汰元素
    private void removeElement() {
        Dto dto  = Collections.min(count.values());
        cache.remove(dto.getKey());
        count.remove(dto.getKey());
    }

    //更新计数器
    private void addCount(Integer key) {
        Dto Dto = count.get(key);
        Dto.setCount(Dto.getCount()+1);
        Dto.setLastTime(System.currentTimeMillis());
    }
    //打印缓存结构和计数器结构
    private void print(){
        System.out.println("cache="+cache);
        System.out.println("count="+count);
    }



    public static void main(String[] args) {
        LFU lfu = new LFU();

        //前3个容量没满,1,2,3均加入
        System.out.println("add 1-3:");
        lfu.put(1, 1);
        lfu.put(2, 2);
        lfu.put(3, 3);
        lfu.print();

        //1,2有访问,3没有,加入4,淘汰3
        System.out.println("read 1,2");
        lfu.get(1);
        lfu.get(2);
        lfu.print();
        System.out.println("add 4:");
        lfu.put(4, 4);
        lfu.print();

        //2=3次,1,4=2次,但是4加入较晚,再加入5时淘汰1
        System.out.println("read 2,4");
        lfu.get(2);
        lfu.get(4);
        lfu.print();
        System.out.println("add 5:");
        lfu.put(5, 5);
        lfu.print();

    }
}
3)结果分析

image-20200604161528512

1-3加入,没问题,计数器为1次
访问1,2,使用次数计数器上升为2次,3没有访问,仍然为1
4加入,3的访问次数最少(1次),所以踢掉3,剩下124
访问2,4,计数器上升,2=3次,1,4=2次,但是1时间久
5加入,踢掉1,最后剩下2,4,5

 

标签:System,算法,add,key,简单,println,public,out
From: https://www.cnblogs.com/wscp/p/18111548

相关文章

  • 简单算法-2
    计数器packagecom.itheima.limit;importjava.util.concurrent.*;publicclassCounter{publicstaticvoidmain(String[]args){//计数器,这里用信号量实现finalSemaphoresemaphore=newSemaphore(3);//定时器,到点清零Sc......
  • 粒子群算法(主要针对连续型函数优化问题)
    文章主要参考了以下博文:https://zhuanlan.zhihu.com/p/5648197181.简介粒子群算法是一种解决最优化问题的通用方法,其优点是求解速度快,数值相对稳定,算法简单。粒子群算法分为连续型粒子群算法和离散型粒子群算法,分别用于解决连续型问题和离散型问题。粒子群优化算法源自对鸟......
  • 代码随想录算法训练营第14天 | 二叉树 | 二叉树的遍历 | 迭代遍历 |统一风格的迭代(待
    理论基础二叉树的存储方式:可以链式也可以顺序用数组顺序存储二叉树的遍历递归遍历递归算法三要素确定递归函数的参数和返回值确定终止条件确定单层递归的逻辑风格不统一的迭代遍历(前后和中序的不同)前序遍历(根左右)//递归版voidtraversal(TreeNode*......
  • python变量和简单的数据类型[第 2 章(上)]
    2.1运行解释文件扩展名:结尾的.py用于指出文件内容是Python代码Python解释器:读取整个文件,确定其中每一行的含义并执行例如,当解释器看到print,就会将括号中的内容打印到屏幕上。语法高亮:用不同的颜色,区分出程序代码中的不同部分 2.2变量修改我们在上一章中写的代......
  • 高精度算法(加、减、乘、除,使用c++实现)
    一、概念在我们进行计算的过程中,经常会遇到几十位,甚至几百位的数字的计算问题,也有可能会遇到小数点后几十位,几百位的情况,而我们面对这样的情况下,  和  的数据范围显然是不够使用的了。因此这时,我们就需要引入一个新的算法,叫做高精度算法。高精度算法:它是处理大数字的数......
  • KMP&&哈希算法
    KMP算法KMP算法是一种字符串匹配算法,用于匹配模式串P在文本串S中出现的所有位置。例如S=“ababac”,P="aba",那么出现的所有位置是13KMP算法将原本O(n^2)的字符串匹配算法优化到了O(n),其精髓在于next数组,next数组表示此时模式串下标失配时应该移动到的位置,(每次下标失配时,就是i!......
  • 代码随想录算法训练营DAY14|C++二叉树Part.1|二叉树的递归遍历、二叉树的迭代遍历、二
    文章目录二叉树的递归遍历思路CPP代码二叉树的迭代遍历思路前序遍历后序遍历后序遍历二叉树的统一迭代法二叉树的递归遍历144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历文章讲解:二叉树的递归遍历视频讲解:每次写递归都要靠直觉?这次带你学......
  • 12.Springsecurity简单总结
    关于springsecurity的介绍后面我接触的应该是这个和Shiro!!!一个网站很重要很重要的是安全问题(狂神说的)哈哈我觉得更重要的是编写吧来看吧maven依赖这个肯定很重要thymeleaf依赖就跳过了这个东西应该很重要我学到现在一直离不开当然我还是没完全搞懂语法嘞就像jsp......
  • 【C++算法】 卡常技巧
    文章目录updata学习引言技巧1——善用修饰符技巧2——输入输出`read`和`write`技巧3——对于运算的优化技巧4——展开循环技巧5——对与循环的优化updata2024.03.31发布此文章学习引言卡常,一种编程技巧,在对时间复杂度要求很高时,就可以用这种办法来节省时......
  • 常见面试算法题-报文解压缩
    ■ 题目描述为了提升数据传输的效率,会对传输的报文进行压缩处理。输入一个压缩后的报文,请返回它解压后的原始报文。压缩规则:n[str],表示方括号内部的str正好重复n次。注意n为正整数(0<n<=100),str只包含小写英文字母,不考虑异常情况。输入描述:输入压缩后的报文:1)不考......