【算法】FIFO先来先淘汰算法分析和编码实战

简介: 【算法】FIFO先来先淘汰算法分析和编码实战

背景

  • 在设计一个系统的时候,由于数据库的读取速度远小于内存的读取速度
  • 为加快读取速度,将一部分数据放到内存中称为缓存,但内存容量是有限的,当要缓存的数据超出容量,就需要删除部分数据
  • 这时候需要设计一种淘汰机制,看哪些数据删除,哪些数据保留
  • 常见的有FIFO、LRU、LFU等淘汰算法
  • 什么是FIFO淘汰算法
  • First In First Out,先进先出,淘汰最早被缓存的对象
  • 是一种常用的缓存淘汰算法,它的原理是按照先进先出的原则
  • 当缓存满了之后,先将最早进入缓存的数据淘汰掉,以腾出空间给新的数据
  • 优点
  • 在于实现简单,不需要记录或统计数据的使用次数,只需要记录每个数据进入缓存的时间和每个数据在缓存中的位置即可
  • 缺点
  • 在于它不能有效地淘汰最近最少使用的数据
  • 最近最少使用的数据可能会被淘汰掉,而最近最多使用的数据也可能被淘汰掉,这样就会导致缓存的效率不够高。

95f1669a636b4326a9f8bb7c607fe64f.png

  • 编码实现
public class FIFOCache <K,V>{
    //定义缓存最大容量
    private int maxSize;
    //定义当前缓存容量
    private int curSize;
    //定义用鱼存放缓存的key
    private LinkedList<K> cacheKey;
    //用于存放缓存的value
    private HashMap<K,V> cacheValue;
    //读写锁,保证线程安全性
    private Lock lock = new ReentrantLock();
    //构造函数
    public FIFOCache(int maxSize) {
        this.maxSize = maxSize;
        this.curSize = 0;
        this.cacheKey = new LinkedList<K>();
        this.cacheValue = new HashMap<K, V>();
    }
    //向缓存中插入key-value
    public void put(K key,V value){
        //加锁
        lock.lock();
        try {
            //如果缓存已满,则删除最老的key
            if (maxSize == curSize) {
                K oldKey = cacheKey.removeFirst();
                cacheValue.remove(oldKey);
                curSize--;
            }
            //插入新的key-value
            cacheKey.add(key);
            cacheValue.put(key,value);
            curSize++;
        }finally {
            //解锁
            lock.unlock();
        }
    }
    // 查询指定key的value
    public V get(K key) {
        return cacheValue.get(key);
    }
    public void printKeys() {
        System.out.println(this.cacheKey.toString());
    }
    public static void main(String[] args) {
        FIFOCache<String,String> cache = new FIFOCache<>(5);
        cache.put("A", "任务A");
        cache.put("B", "任务B");
        cache.put("C", "任务C");
        cache.put("D", "任务D");
        cache.put("E", "任务E");
        cache.printKeys();
        cache.put("F", "任务F");
        cache.printKeys();
        System.out.println("G=" + cache.get("G"));
        System.out.println("C=" + cache.get("C"));
    }
}

bf4751957b4843f2b363d810790b81f2.png

相关文章
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
58 4
|
23天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
23天前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
19 1
|
29天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
2月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
54 2
|
2月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
57 4
|
1月前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
41 1
|
1月前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
40 0