华为OD机试 - 文件缓存系统——优先队列解法

华为OD机试 - 文件缓存系统——优先队列解法

  • 题目描述
  • 题目分析
  • 代码解析
  • 复杂度分析

题目描述

题目描述链接🔗

题目分析

  • 这题需要我们实现一个LFUCache的自定义数据结构,根据题意,需要分别定义一个putget方法,用于存储缓存和获取缓存。
  • 本题难点在于put方法中,如果当前缓存空间如果不够存放新加入的缓存,则需要将已有缓存根据条件进行删除,直到可以存放新加的缓存。这里的条件是两个维度,分别是访问次数(少->多)、访问时间(老->新)。
  • 我们需要一个数据结构来通过这两个条件,对加入的缓存进行排序,方便我们快速获取要删除的缓存,这里我们选择优先队列进行存储。并将访问次数和访问时间这两个属性将缓存封装为Cache的数据结构,通过这两个属性对Cache进行排序即可。

代码解析

代码已AC,细节见下面注释👇🏻

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int capacity = Integer.parseInt(sc.nextLine());int n = Integer.parseInt(sc.nextLine());LFUCache lfuCache = new LFUCache(capacity);//读取后续n个操作for (int i = 1; i <= n; i++) {String[] str = sc.nextLine().split(" ");//这里通过数组长度判断put/get操作,也可以通过第0个索引的字符串判断if (str.length == 3) {lfuCache.put(str[1], Integer.parseInt(str[2]), i);} else if (str.length == 2) {lfuCache.get(str[1], i);}}lfuCache.printCaches();}private static class LFUCache {private static int capacity;//缓存中剩余的空间private static int freeCap;private static final HashMap<String, Cache> name2File = new HashMap<>();//按访问次数从少到多,访问时间从老到新(从小到大)对缓存排序private static final PriorityQueue<Cache> pq = new PriorityQueue<>((a, b) ->a.visitCount == b.visitCount ? (a.visitTime - b.visitTime): a.visitCount - b.visitCount);public LFUCache(int capacity) {LFUCache.capacity = capacity;freeCap = capacity;}public void put(String fileName, int fileSize, int visitTime) {if (name2File.containsKey(fileName) || fileSize > capacity) {return;}Cache cache = new Cache(fileName, fileSize, visitTime);if (freeCap < cache.size) {//LFUCache剩余空间不够时,需要将已有缓存移除,直到满足当前新缓存cachewhile (freeCap < cache.size) {if (pq.size() == 0) {return;}//移除时需要将map和pq中的同一个对象都移除Cache removed = pq.poll();name2File.remove(removed.name);freeCap += removed.size;}}//新加入时也要分别存储name2File.put(fileName, cache);pq.offer(cache);freeCap -= fileSize;}public void get(String fileName, int visitTime) {Cache cache = name2File.get(fileName);if (cache == null) {return;}//更新cache访问次数和时间cache.visitCount++;cache.visitTime = visitTime;//这个cache在map和优先队列中是同一个对象,修改了上面两个属性后优先队列并未重新排序//因此这里通过将cache重新加入队列的方式进行重新排序pq.remove(cache);pq.add(cache);}public void printCaches() {Collection<Cache> values = name2File.values();//没有缓存时,打印NONEif (values.size() == 0) {System.out.println("NONE");}StringJoiner sj = new StringJoiner(",");//剩余缓存字典序排序输出values.stream().sorted((a, b) -> a.name.compareTo(b.name)).forEach(a -> sj.add(a.name));System.out.println(sj);}}private static class Cache {String name;int size;int visitCount;//访问时间,值越大访问时间越新int visitTime;public Cache(String name, int size, int visitTime) {this.name = name;this.size = size;this.visitCount = 0;this.visitTime = visitTime;}}
}

复杂度分析

时间复杂度:O(nlogn),优先队列一次put或get操作需要O(logn)的时间,n个元素共需要O(nlogn),n是操作数量。
空间复杂度:O(n),n是操作数量,主要是一个哈希表和优先队列所占空间。

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

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

相关文章

基于YOLO8的目标检测系统:开启智能视觉识别之旅

文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 target_dec_app.py 二、核心代码介绍篇2.1 target_dec_app.py2.2 scan_taskflow.py 三、结语 在线体验 基于YOLO8的目标检测系统 基于opencv的摄像头…

从等保测评看行业安全趋势:洞察与预测

在当今数字化时代&#xff0c;网络安全已成为各行各业的头等大事。等保测评&#xff08;等级保护测评&#xff09;&#xff0c;作为国家对信息系统安全的重要管理手段&#xff0c;不仅关乎企业的合规性&#xff0c;更是行业安全水平的重要衡量标准。本文将从等保测评的视角出发…

敏捷CSM认证:精通敏捷Scum估算方法,高效完成项目!

咱们做项目的时候可能都遇到过这种情况&#xff1a;项目一开始信心满满&#xff0c;觉得 deadline 稳了。结果呢&#xff1f;各种意外状况频出&#xff0c;时间好像怎么都不够用了&#xff0c;最后项目只能无奈延期&#xff0c;整个团队都像霜打的茄子。 说到底&#xff0c;还…

谷粒商城实战笔记-44-前端基础-Vue-整合ElementUI快速开发/设置模板代码

文章目录 一&#xff0c;安装导入ElementUI1&#xff0c;安装 element-ui2&#xff0c;导入 element-ui 二&#xff0c;ElementUI 实战1&#xff0c;将 App.vue 改为 element-ui 中的后台布局2&#xff0c;开发导航栏2.1 开发MyTable组件2.2 注册路由2.3 改造App.vue2.4 新增左…

Qt实现简易CAD软件的开发:技术解析与实现

文章目录 简易CAD软件的开发&#xff1a;技术解析与实现引言项目概述程序入口主窗口的实现主窗口类定义&#xff08;mainwindow.h&#xff09;主窗口类实现&#xff08;mainwindow.cpp&#xff09; 自定义绘图视图自定义绘图视图类定义&#xff08;myqgraphicsview.h&#xff0…

深入浅出C语言指针(进阶篇)

深入浅出C语言指针(基础篇) 深入浅出C语言指针(进阶篇) 目录 引言 一、指针和数组 1.数组名的理解 2.指针访问数组 3.一维数组传参的本质 二、二级指针 1.二级指针的概念 2.二级指针的内存表示 3.二级指针的解引用 三、字符指针 1.指针指向单个字符 2.指针指向字…

Django日志配置

settings.py# 日志 LOGGING {version: 1,disable_existing_loggers: False,formatters: {verbose: {format: %(asctime)s %(levelname)s %(pathname)s:%(lineno)d %(message)s,},simple: {format: %(levelname)s %(message)s,},},handlers: {console: {class: logging.StreamH…

便携式自动气象站:科技赋能气象观测

便携式自动气象站&#xff0c;顾名思义&#xff0c;就是一款集成了多种气象传感器&#xff0c;能够自动进行气象观测和数据记录的设备。它体积小巧、重量轻&#xff0c;便于携带和快速部署&#xff0c;可以在各种环境下进行气象数据的实时监测。同时&#xff0c;通过内置的无线…

对于相同网段的IP,部分无法ping通问题

现象1&#xff1a;在Linux上执行 ping 192.168.1.232&#xff0c;无法ping通 分析1&#xff1a;使用ifconfig查询&#xff0c;联网使用eth0口&#xff0c;只能上网192.168.10.xx网段&#xff0c;需要增加网段 解决方法&#xff1a;使用ip addr 查询&#xff0c;本身只具备10网…

企业未进行等保测评会有什么影响

在当今数字化高速发展的时代&#xff0c;信息安全对于企业的重要性日益凸显。信息安全等级保护测评&#xff08;以下简称等保测评&#xff09;作为保障企业信息系统安全的重要手段&#xff0c;已成为众多企业必须面对的课题。然而&#xff0c;仍有部分企业未能充分认识到等保测…

版本更新 | Orillusion 0.8发布,与大家同在!

过了这么久&#xff0c;我们Orillusion引擎的大版本更新终于来啦&#xff01; 这次的版本发布&#xff0c;大部分是更新了引擎底层能力&#xff0c;有兴趣的小伙伴可以直接查看&#xff1a; &#x1f517; https://github.com/Orillusion/orillusion 其实面对社区的小伙伴&…

应对爬虫过程中代理IP掉线的实用指南

当代理IP在爬虫中频繁掉线时&#xff0c;我们先要了解出现问题的可能原因&#xff0c;这不仅限于技术性因素&#xff0c;还涉及操作策略和环境因素。只有在找到具体原因后&#xff0c;才能针对问题类型从源头解决IP掉线问题。 一、问题原因&#xff1a; 1. 代理IP质量问题导致…

Python将字典转换为DataFrame的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

AWS监控工具,监控性能指标

执行AWS监视是为了跟踪在AWS环境中主动运行的应用程序工作负载和资源&#xff0c;AWS监视器跟踪各种AWS云指标&#xff0c;以帮助提高在其上运行的应用程序的整体性能。 借助阈值突破警报系统&#xff0c;AWS应用程序监控在识别性能瓶颈来源方面起着至关重要的作用&#xff0c…

力扣高频SQL 50题(基础版)第五题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第五题1683. 无效的推文题目说明&#xff1a;思路分析&#xff1a;实现过程&#xff1a;结果截图&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第五题 1683. 无效的推文 题目说明&#xff1a; 表&a…

图片转pdf的软件有哪些?这几种转换工具了解下

在日常的办公学习中&#xff0c;图片转PDF的需求愈发普遍。不论是工作汇报、学习笔记还是生活点滴&#xff0c;我们都希望将重要的图片内容整理成易于查阅的PDF格式。那么&#xff0c;有哪些软件可以做到将图片转换成PDF格式呢&#xff1f;给大家介绍5种简单好用的转换方法&…

C#基础:数据库分表的好处和实现方式

一、分表的好处&#xff1a; 1.提升查询速度&#xff1a;分表筛选后再拼接&#xff0c;而不是查大表&#xff0c;速度会显著提升 2.管理容易&#xff1a;根据业务需求&#xff0c;通常会按照时间或者空间来分表 3.提高并发性&#xff1a;降低锁竞争和查询阻塞的风险&#xf…

Xlua原理 二

一已经介绍了初步的lua与C#通信的原理&#xff0c;和xlua的LuaEnv的初始化内容。 这边介绍下Wrap文件。 一.Wrap介绍 导入xlua后可以看到会多出上图菜单。 点击后生成一堆wrap文件&#xff0c;这些文件是lua调用C#时进行映射查找用的中间代码。这样就不需要去反射调用节约性…

ubuntu安装mysql8.0

文章目录 ubuntu版本安装修改密码取消root跳过密码验证 ubuntu版本 22.04 安装 更新软件包列表 sudo apt update安装 MySQL 8.0 服务器 sudo apt install mysql-server在安装过程中&#xff0c;系统可能会提示您设置 root 用户的密码&#xff0c;请务必牢记您设置的密码。…

【中项】系统集成项目管理工程师-第4章 信息系统架构-4.3应用架构

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…