文章目录

  • 1. 代码实现:说说LRU,并代码实现LRU
    • 为什么使用哈希表?(有两个原因)
      • 1. 仅用双向链表的缺陷
    • 2. 引入哈希表的作用
      • 1. 快速查找:
      • 2. 快速插入与删除:
    • 双向链表 + 哈希表的协作过程
    • 举例说明
    • 代码实现
  • 14、一个线程池应该包含什么?

1. 代码实现:说说LRU,并代码实现LRU

在这里插入图片描述

为什么使用哈希表?(有两个原因)

1. 仅用双向链表的缺陷

如果只使用双向链表来实现 LRU,每次你需要查找某个缓存键值时,必须从链表头部开始遍历,直到找到目标节点。这种操作的时间复杂度是 O(n),其中 n 是链表的长度,即缓存的大小。如果缓存很大,这种查找操作会变得非常慢。

例如:
假设你缓存了 1000 个键值对,要查找某个键时,你需要遍历 1000 个节点才能找到目标。这种线性查找效率非常低。

2. 引入哈希表的作用

哈希表(unordered_map)用于将键映射到双向链表中的节点,允许我们在 O(1) 的时间内直接找到双向链表中的目标节点。通过哈希表,避免了链表的线性查找。下面是哈希表在 LRU 实现中的几个作用:

1. 快速查找:

通过哈希表,你可以在 O(1) 的时间内直接定位到缓存中某个键对应的双向链表节点。例如,当你调用 get(key) 时,不需要遍历链表来查找,而是直接通过哈希表找到节点。

  • 没有哈希表时查找是 O(n)。
  • 有了哈希表后,查找是 O(1)。

2. 快速插入与删除:

当缓存中不存在某个键时,使用 put(key, value),可以通过哈希表快速将新节点插入双向链表,并将其键值存入哈希表;如果缓存满了,也可以通过哈希表在 O(1) 时间内定位到需要删除的节点,并将其从链表和哈希表中移除。

双向链表 + 哈希表的协作过程

在这里插入图片描述

举例说明

假设我们有一个容量为 2 的 LRU 缓存,操作过程如下:

  1. put(1, 1):插入键值对 (1, 1)。链表中插入新节点,同时将键 1 映射到该节点。
    - 链表:[1](1是最新的)
    - 哈希表:{1 -> 节点1}
  2. put(2, 2):插入键值对 (2, 2)。
    - 链表:[2, 1](2是最新的,1是次新的)
    - 哈希表:{1 -> 节点1, 2 -> 节点2}
  3. get(1):访问键 1。
    - 通过哈希表查找键 1 对应的节点,并将其移到链表头部,表示最近使用。
    - 链表:[1, 2](1是最新的,2是次新的)
    - 哈希表:{1 -> 节点1, 2 -> 节点2}
  4. put(3, 3):插入键值对 (3, 3)。因为缓存满了,删除最久未使用的键 2。
    - 链表:[3, 1](3是最新的,1是次新的)
    - 哈希表:{1 -> 节点1, 3 -> 节点3}

如果没有哈希表,在 get(1) 操作时,你需要遍历整个链表来找到键 1。而引入哈希表后,可以在 O(1) 时间内直接定位到键 1 对应的节点,大幅提升查找效率。

代码实现

14、一个线程池应该包含什么?

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一个线程池在实现时,通常需要包含以下几个关键组成部分:
在这里插入图片描述

线程池的一个简单示例代码:

#include <iostream>
#include <vector>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <future>class ThreadPool {
public:ThreadPool(size_t threads);~ThreadPool();template<class F, class... Args>auto enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type>;private:// 工作线程std::vector<std::thread> workers;// 任务队列std::queue<std::function<void()>> tasks;// 同步std::mutex queue_mutex;std::condition_variable condition;bool stop;
};// 构造函数,创建线程池
ThreadPool::ThreadPool(size_t threads) : stop(false) {for (size_t i = 0; i < threads; ++i) {workers.emplace_back([this] {for (;;) {std::function<void()> task;{std::unique_lock<std::mutex> lock(this->queue_mutex);this->condition.wait(lock, [this]{ return this->stop || !this->tasks.empty(); });if (this->stop && this->tasks.empty()) return;task = std::move(this->tasks.front());this->tasks.pop();}task();}});}
}// 添加任务到线程池中
template<class F, class... Args>
auto ThreadPool::enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> {using return_type = typename std::result_of<F(Args...)>::type;auto task = std::make_shared<std::packaged_task<return_type()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...));std::future<return_type> res = task->get_future();{std::unique_lock<std::mutex> lock(queue_mutex);if (stop) {throw std::runtime_error("enqueue on stopped ThreadPool");}tasks.emplace([task](){ (*task)(); });}condition.notify_one();return res;
}// 析构函数,销毁线程池
ThreadPool::~ThreadPool() {{std::unique_lock<std::mutex> lock(queue_mutex);stop = true;}condition.notify_all();for (std::thread &worker : workers) {worker.join();}
}int main() {ThreadPool pool(4);auto result1 = pool.enqueue([](int answer) { return answer; }, 42);auto result2 = pool.enqueue([](int a, int b) { return a + b; }, 10, 20);std::cout << "Result 1: " << result1.get() << std::endl;std::cout << "Result 2: " << result2.get() << std::endl;return 0;
}

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920743.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920743.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920743.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Word文档怎么打印?Word打印技巧?【图文详解】单面/双面/指定页面/逆序等Word打印选项

一、问题背景 在日常办公、学习场景中&#xff0c;Word文档作为常用的文字处理载体&#xff0c;经常需要将电子内容转化为纸质版本&#xff0c;比如提交报告、打印学习资料、整理文档存档等。 但不少用户在尝试打印Word文档时&#xff0c;常会遇到各种阻碍&#xff1a;有的不清…

漫谈《数字图像处理》之基函数与基图像

在数字图像处理领域&#xff0c;基函数与基图像是贯穿理论分析与实际应用的核心概念 —— 它们如同 “乐高积木”&#xff0c;将复杂的图像信号拆解为可解释、可操作的基本单元&#xff0c;支撑起压缩、去噪、特征提取等一系列关键任务。从传统的傅里叶变换到前沿的因子场理论&…

打开多个Excel文件后快速关闭所有的文档,并且退出Excel应用

打开多个Excel文件后如果要快速关闭所有的文档&#xff0c;并且退出Excel应用&#xff0c;可以按住Shift键右上角的号&#xff08;关闭按钮&#xff09;。Word和PowerPoint也是一样的操作。如果有文档修改后没有保存&#xff0c;会提示是否保存。作为补充&#xff0c;先来看看两…

基于 PyTorch 构建 Dataset 与 DataLoader:从 TXT 文件读取到新增类别全流程指南

基于 PyTorch 构建 Dataset 与 DataLoader&#xff1a;从 TXT 文件读取到新增类别全流程指南在深度学习计算机视觉任务中&#xff0c;数据加载与预处理是模型训练的基础环节&#xff0c;直接影响模型的训练效率与最终性能。PyTorch 作为主流深度学习框架&#xff0c;提供了Data…

hive on tez如果是2个大表union会写几次临时文件到hdfs目录,数据量如何计算

如果是2个大表union会写几次临时文件到hdfs目录&#xff0c;数据量如何计算 在Hive on Tez中&#xff0c;两个大表执行UNION操作时&#xff0c;临时文件的写入次数和数据量&#xff0c;取决于UNION的类型&#xff08;UNION ALL还是UNION去重&#xff09;以及执行计划的Stage划分…

Web+js转uni-app+ts

一、入手uni-app 官方文档&#xff1a;uni-app官网 1.创建uni-app项目 1.1通过HBuilderX进行创建 官方地址&#xff1a;HBuilderX-高效极客技巧 1.2通过命令行创建 // js 版本的 npx degit dcloudio/uni-preset-vue#vite 项目名 npx degit dcloudio/uni-preset-vue#vite-…

IO_hw_8.29

1.使用fgets和fputs完成两个文件的拷贝&#xff0c;要求文件名使用外部传承2.注册登录代码3.思维导图4.牛客网刷题记录

数据结构(04)—— 栈和队列

Hi&#xff01;探索者们&#x1f609;&#xff0c;欢迎踏入 408 数据结构的奇妙秘境&#x1f33f;&#xff01;​ 我是 ankleless&#x1f4da;&#xff0c;和你并肩的寻宝人&#xff5e; 这是我的探险手札&#x1f5fa;️&#xff0c;里面记着链表森林的岔路陷阱&#x1f578;…

Java多线程基础:进程、线程与线程安全实战

Java多线程基础&#xff1a;进程、线程与线程安全实战 &#x1f680; 极客小贴士 &#x1f4a1; 你知道吗&#xff1f; 在Java中&#xff0c;每个线程都有自己的栈空间&#xff0c;但共享堆内存。这就像每个员工都有自己的办公桌&#xff0c;但共享公司的会议室和打印机&#…

2025 实测有效!手把手教你如何用实例代码(Python、JavaScript 、JAVA) 等实战代码,免费股票数据接口大全

​ 近年来&#xff0c;股票量化分析凭借其科学性与系统性&#xff0c;逐渐走进大众视野并受到广泛关注。对于这一领域的初学者而言&#xff0c;入门路上的第一道关卡便是如何获取全面且精准的股票数据。要知道&#xff0c;实时交易数据、历史交易记录、财务数据以及基本面信息等…

KMP 算法相关练习题

大家好&#xff0c;今天是2025年8月31日&#xff0c;上一期我给大家分享了 KMP 算法的相关知识&#xff0c;今天我来带领大家学习4道 KMP 相关的算法题。 在学习算法题之前&#xff0c;还是希望大家能够要先学会 KMP 算法&#xff08;可以参考这篇文章&#xff1a;KMP 算法&am…

张柏芝亮相林家谦演唱会 再次演绎《任何天气》

近日&#xff0c;张柏芝作为特别嘉宾亮相歌手林家谦演唱会。当天&#xff0c;张柏芝身着一袭浅米色蕾丝裙装&#xff0c;轻盈面料搭配层叠设计&#xff0c;行走间裙摆微扬&#xff0c;温柔气质满溢&#xff0c;为舞台增添了一抹温柔亮色。舞台上&#xff0c;张柏芝接连演绎《任…

Android 权限申请现代化指南

Android 权限申请现代化指南 一、核心概念&#xff1a;权限分类 Android 将权限分为三大类&#xff0c;申请方式各不相同&#xff1a; 普通权限 (Normal Permissions)范围&#xff1a;涉及应用沙盒外部但对用户隐私或设备操作风险极低的操作。示例&#xff1a;网络访问 (IN…

大话 IOT 技术(3) -- MQTT篇

文章目录前言前情提要MQTT介绍组成万恶的appmqtt服务端伪代码实现开源的力量后话当你迷茫的时候&#xff0c;请点击 物联网目录大纲 快速查看前面的技术文章&#xff0c;相信你总能找到前行的方向 前言 本篇将开始讲述IOT技术的一个重点&#xff0c;mqtt协议。 我发现有一个…

大语言模型生成的“超龄劳动者权益保障制度系统化完善建议(修订版)”

大纲 │ ├── 一、基于征求意见稿现状的评估 │ ├── 制度意义&#xff1a;25条暂行规定首次明确权益范围&#xff0c;提供法律依据 │ └── 关键缺陷 │ ├── 法律定位不明确 │ ├── 社保衔接不足 │ └── 实施机制不完善 │ ├── 二、法…

【UnityAS】Unity Android Studio 联合开发快速入门:环境配置、AAR 集成与双向调用教程

这是一篇2021年的存档&#xff0c;使用Unity2020版本。 至今&#xff0c;Unity与AS很多通讯方式也是基于此衍生。 作为Unity与AS联合开发的受益者&#xff0c;难得掏出自己的饭碗&#xff0c;诸君共享&#xff01; Unity & Android Studio 联合开发快速入门 ——Unity与AS…

前后端联合实现多个文件上传

1、前端 Vue3CommonApplyBasicInfoForm.vue<script setup lang"ts" name"CommonApplyBasicInfoForm"> ...... // 文件输入实例对象 const fileInputRef ref<HTMLInputElement | null>(null); // 选择文件列表 const selectedFiles ref<Fi…

软考高级--系统架构设计师--综合知识真题解析

系列文章目录 文章目录系列文章目录一、2019年真题二、2020年真题三、2021年真题四、2022年真题总结一、2019年真题 二、2020年真题 三、2021年真题 四、2022年真题 总结

“帕萨特B5钳盘式制动器结构设计三维PROE模型7张CAD图纸PDF图“

摘 要本文首先对汽车制动器原理和对各种各样的制动器进行分析,详细地阐述了各类制动器的结构,工作原理和优缺点。再根据轿车的车型和结构选择了适合的方案。根据市场上同系列车型的车大多数是滑钳盘式制动器,而且滑动钳式盘式制动器结构简单,性能居中,设计规范,所以我选择滑动…

SQL注入6----(其他注入手法)

一.前言 本章节来介绍一下其他的注入手法&#xff0c;也就是非常规注入手法&#xff0c;来和大家介绍一下 二.加密注入 前端提交的有些数据是加密之后&#xff0c;到了后台在解密&#xff0c;然后再进行数据库查询等相关操作的&#xff0c;那么既然如 此我们也应该将注入语句…