机试题——DNS本地缓存
题目描述
正在开发一个DNS本地缓存系统。在互联网中,DNS(Domain Name System)用于将域名(例如www.example.com)解析为IP地址,以便将请求发送到正确的服务器上。通常情况下,DNS请求会发送到互联网上的某个DNS服务器,这会造成一定的网络延迟和负载。为了解决这个问题要开发一个本地DNS缓存系统,可以在本地缓存一部分DNS请求的结果,以提高性能和减轻网络负载。
DNS本地缓存系统有以下功能:
- 系统初始状态无存储记录,最大可缓存N条记录。
- 系统每1秒能解析1个URL地址,先从本地DNS上查找:
- 如果本地缓存中能查到就直接返回
from_cache。 - 如果本地DNS上没有该地址,返回
from_internet,并从URL的属性列表tls上,读取该URL的TTL(Time To Live,代表该URL的生存时长,即能够保存到缓存系统中的时长),并将URL存入缓存系统中;如果在tls上未能读到该URL的TTL,设置默认TTL为5秒。
- 如果本地缓存中能查到就直接返回
- 本地缓存系统中URL地址的
TTL每秒减1,当TTL=0时,将该URL地址从缓存系统中移除。 - 在系统空间装满后,如果还有新的URL要录入,则将
TTL最小的一个URL移除,如果TTL最小的URL存在多个,按照先进先出的方式移除1个URL。 - 现在每1秒输入一个URL地址,求每个URL地址的解析方式(
from_cache还是from_internet)。
输入描述
输入包含多行:
- 第一行包含两个整数
N和X,分别表示DNS缓存系统的最大缓存记录数和待请求的URL数量。 - 第二行包含
X个整数,分别代表对应的URL地址,形如:url1, url2, url3, ..., urlX,元素允许重复。 - 第三行包含一个整数
Y,表示URL的属性列表tls的长度。 - 接下来的
Y行,每行包含两个整数url_i和ttl_i,分别表示URL的编号和对应的TTL值。
数据范围说明:
0 < N, X, Y ≤ 65535,N、X、Y为正整数。0 ≤ url_i, ttl_i ≤ 65535,url_i、ttl_i为整数。
输出描述
输出每秒中URL的解析方式列表:
0表示from_cache。1表示from_internet。
用例输入
5 5
3 1 2 1 2
2
1 4
2 2
1 1 1 0 1
10 15
11 14 10 5 8 3 8 13 12 9 12 15 15 7 7
8
11 2
14 11
10 9
5 7
8 1
13 10
9 10
15 8
1 1 1 1 1 1 1 1 1 1 0 1 0 1 0
解题思路
本题需要模拟一个DNS本地缓存系统的工作过程,主要思路如下:
- 数据结构设计:
- 使用一个优先队列(最小堆)来管理缓存中的URL,以便快速找到
TTL最小的URL。 - 使用一个布尔数组
f来记录某个URL是否在缓存中,以便快速判断是否命中缓存。
- 使用一个优先队列(最小堆)来管理缓存中的URL,以便快速找到
- 初始化:
- 读取输入数据,包括缓存大小
N、URL数量X、URL列表以及URL的TTL属性。 - 初始化所有URL的默认
TTL为5秒。
- 读取输入数据,包括缓存大小
- 模拟每秒的解析过程:
- 每秒处理一个URL:
- 先检查缓存中是否有该URL:
- 如果有,输出
0(from_cache)。 - 如果没有,输出
1(from_internet),并将该URL加入缓存。
- 如果有,输出
- 如果缓存已满,移除
TTL最小的URL(如果TTL最小的URL有多个,按照先进先出移除)。 - 更新缓存中所有URL的
TTL,移除TTL为0的URL。
- 先检查缓存中是否有该URL:
- 每秒处理一个URL:
- 输出结果:
- 按照每秒的解析结果输出对应的
0或1。
- 按照每秒的解析结果输出对应的
代码
#include <iostream>
#include <vector>
#include <queue>
#include <sstream>
#include <string>
#include <stack>
#include <algorithm>
#include <map>
using namespace std;
#define msize 100005struct node {int edt, stt, id; // edt代表生存周期结束时间,stt代表开始时间bool operator<(const node& b) const {// 优先队列默认为大堆顶,所以要将优先删除的TTL最小的// 即结束时间最小的排在前面,相等时按先进先出原则,按开始时间排序。if (edt == b.edt) return stt > b.stt;return edt > b.edt;}
};int n, x, y; // 请求数量 cache大小 ts表大小
priority_queue<node> q; // 优先队列定义
int re[msize]; // 请求数量
int ttls[msize]; // 每个URL的ttl
bool f[msize]; // 记录当前队列中有没有某个URLint main() {ios::sync_with_stdio(false);cin.tie(nullptr);cin >> n >> x;for (int i = 1; i <= x; i++) {cin >> re[i];}for (int i = 0; i < msize; i++) {ttls[i] = 5;f[i] = 0;}cin >> y;for (int i = 0; i < y; i++) {int u, t;cin >> u >> t;ttls[u] = t;}for (int i = 1; i <= x; i++) {// 已经过期了while (q.size() && q.top().edt <= i) {f[q.top().id] = 0; // 该url不在了q.pop();}if (f[re[i]]) {// 存在缓存中cout << "0 ";} else {// 缓存满了就得扔出去一个if (q.size() == n) {f[q.top().id] = 0;q.pop();}f[re[i]] = 1;q.push({i + ttls[re[i]], i, re[i]});cout << "1 ";}}
}
相关文章:
机试题——DNS本地缓存
题目描述 正在开发一个DNS本地缓存系统。在互联网中,DNS(Domain Name System)用于将域名(例如www.example.com)解析为IP地址,以便将请求发送到正确的服务器上。通常情况下,DNS请求会发送到互联…...
Day38【AI思考】-彻底打通线性数据结构间的血脉联系
文章目录 **彻底打通线性数据结构间的血脉联系****数据结构家族谱系图****一、线性表(老祖宗的规矩)****核心特征** **二、嫡系血脉解析**1. **数组(规矩森严的长子)**2. **链表(灵活变通的次子)** **三、庶…...
【LeetCode】152、乘积最大子数组
【LeetCode】152、乘积最大子数组 文章目录 一、dp1.1 dp1.2 简化代码 二、多语言解法 一、dp 1.1 dp 从前向后遍历, 当遍历到 nums[i] 时, 有如下三种情况 能得到最大值: 只使用 nums[i], 例如 [0.1, 0.3, 0.2, 100] 则 [100] 是最大值使用 max(nums[0…i-1]) * nums[i], 例…...
[MRCTF2020]Ez_bypass1(md5绕过)
[MRCTF2020]Ez_bypass1(md5绕过) 这道题就是要绕过md5强类型比较,但是本身又不相等: md5无法处理数组,如果传入的是数组进行md5加密,会直接放回NULL,两个NuLL相比较会等于true; 所以?id[]1&gg…...
MySQL 缓存机制与架构解析
目录 一、MySQL缓存机制概述 二、MySQL整体架构 三、SQL查询执行全流程 四、MySQL 8.0为何移除查询缓存? 五、MySQL 8.0前的查询缓存配置 六、替代方案:应用层缓存与优化建议 总结 一、MySQL缓存机制概述 MySQL的缓存机制旨在提升数据访问效率&am…...
LabVIEW自定义测量参数怎么设置?
以下通过一个温度采集案例,说明在 LabVIEW 中设置自定义测量参数的具体方法: 案例背景 假设使用 NI USB-6009 数据采集卡 和 热电偶传感器 监测温度,需自定义以下参数: 采样率:1 kHz 输入量程:0~10 V&a…...
海思的一站式集成环境Hispark Studio更新了
HiSpark Studio是海思提供的面向智能设备开发者提供一站式集成开发环境,支持代码编辑、编译、烧录和调试等功能。我以前在评测星闪芯片的时候用过,当时写了篇博客:【星闪开发连载】WS63E开发板Windows环境的构建_hispark studio-CSDN博客。那…...
TresJS:用Vue组件构建3D场景的新选择
在当今数字化时代,3D图形技术正以前所未有的速度发展,从游戏开发到虚拟现实(VR)、增强现实(AR),再到各种沉浸式体验,3D技术的应用场景日益丰富。TresJS作为一款基于Three.js的Web3D开…...
Axure设计教程:动态排名图(中继器实现)
一、开篇 在Axure原型设计中,动态图表是展示数据和交互效果的重要元素。今天,我们将学习如何使用中继器来创建一个动态的排名图,该图表不仅支持自动轮播,还可以手动切换,极大地增强了用户交互体验。此教程旨在提供一个…...
攻防世界 文件上传
题目名称-文件包含 今天的题大概提一下解题思路就好了 这里要使用php://filter 在此基础上因为网页过滤了一些关键字 我们要进行爆破 UCS-4* UCS-4BE UCS-4LE* UCS-2 UCS-2BE UCS-2LE UTF-32* UTF-32BE* UTF-32LE* UTF-16* UTF-16BE* UTF-16LE* UTF-7 UTF7-IMAP UTF-8* ASCII…...
从 .NET Framework 升级到 .NET 8 后 SignalR 问题处理与解决方案
随着 .NET Framework 向 .NET 8 的迁移,许多开发者在使用 SignalR 时遇到了一些前后端连接、配置、调用等方面的问题。尤其是在处理 SignalR 实时通信功能时,升级后的一些兼容性问题可能导致应用程序无法正常工作。本文将介绍在从 .NET Framework 升级到…...
《Node.js Express 框架》
《Node.js Express 框架》 引言 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者使用 JavaScript 来编写服务器端代码。Express 是一个简洁、灵活的 Node.js Web 应用框架,它为 Web 和移动应用程序提供了一系列强大的功能。本文将详细介绍 Node.js …...
Unity LineRenderer 画线及代码控制--Unity小记
Unity LineRenderer 画线及代码控制 目录 Unity LineRenderer 画线及代码控制 一、添加LineRenderer 组件 二、LineRenderer设置起始坐标 三、设置LinRenderer 四、代码片段,找代码直接点我(找代码直接点我) 一、添加LineRenderer 组件…...
llama.cpp GGML Quantization Type
llama.cpp GGML Quantization Type 1. GGML Quantization Type2. static const struct ggml_type_traits type_traits[GGML_TYPE_COUNT]3. Q#_K_M and Q#_KReferences 什么神仙妖魔,不过是他们禁锢异族命运的枷锁! GGUF https://huggingface.co/docs/hu…...
k8s部署go-fastdfs
前置环境:已部署k8s集群,ip地址为 192.168.10.1~192.168.10.5,总共5台机器。 1. 创建provisioner制备器(如果已存在,则不需要) 制备器的具体部署方式可参考我的上一篇文章: k8s部署rabbitmq-CSDN博客文章浏览阅读254次,点赞3次,收藏5次。k8s部署rabbitmqhttps://blo…...
Python----Python高级(并发编程:协程Coroutines,事件循环,Task对象,协程间通信,协程同步,将协程分布到线程池/进程池中)
一、协程 1.1、协程 协程,Coroutines,也叫作纤程(Fiber) 协程,全称是“协同程序”,用来实现任务协作。是一种在线程中,比线程更加轻量级的存在,由程序员自己写程序来管理。 当出现IO阻塞时,…...
什么是可观测性?
现代服务架构常常谈及三个性: 弹性,韧性,可观测性。今天且按下其他两性不表,着重聊一聊可观测性。本文就几个主题对可观测性展开讨论: 可观测性是什么可观测性是必须的吗企业的可观测性落地 可观测性理念 可观测性是…...
3. 【.NET Aspire 从入门到实战】--理论入门与环境搭建--环境搭建
构建现代云原生应用程序时,开发环境的搭建至关重要。NET Aspire 作为一款专为云原生应用设计的开发框架,提供了一整套工具、模板和集成包,旨在简化分布式系统的构建和管理。开始项目初始化之前,确保开发环境的正确配置是成功的第一…...
kubeadm构建k8s源码阅读环境
目标 前面看了minikube的源码了解到其本质是调用了kubeadm来启动k8s集群,并没有达到最初看代码的目的。 所以继续看看kubeadm的代码,看看能否用来方便地构建源码调试环境。 k8s源码编译 kubeadm源码在k8s源码库中,所以要先克隆k8s源码。之…...
【Flink快速入门-1.Flink 简介与环境配置】
Flink 简介与环境配置 实验介绍 在学习一门新的技术之前,我们首先要了解它的历史渊源,也就是说它为什么会出现,它能够解决什么业务痛点。所以本节我们的学习目的是了解 Flink 的背景,并运行第一个 Flink 程序,对它有…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
