机试题——DNS本地缓存

server/2025/2/8 11:20:28/

题目描述

正在开发一个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)。

输入描述

输入包含多行:

  1. 第一行包含两个整数NX,分别表示DNS缓存系统的最大缓存记录数和待请求的URL数量。
  2. 第二行包含X个整数,分别代表对应的URL地址,形如:url1, url2, url3, ..., urlX,元素允许重复。
  3. 第三行包含一个整数Y,表示URL的属性列表tls的长度。
  4. 接下来的Y行,每行包含两个整数url_ittl_i,分别表示URL的编号和对应的TTL值。

数据范围说明:

  • 0 < N, X, Y ≤ 65535NXY为正整数。
  • 0 ≤ url_i, ttl_i ≤ 65535url_ittl_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本地缓存系统的工作过程,主要思路如下:

  1. 数据结构设计
    • 使用一个优先队列(最小堆)来管理缓存中的URL,以便快速找到TTL最小的URL。
    • 使用一个布尔数组f来记录某个URL是否在缓存中,以便快速判断是否命中缓存。
  2. 初始化
    • 读取输入数据,包括缓存大小N、URL数量X、URL列表以及URL的TTL属性。
    • 初始化所有URL的默认TTL为5秒。
  3. 模拟每秒的解析过程
    • 每秒处理一个URL:
      • 先检查缓存中是否有该URL:
        • 如果有,输出0from_cache)。
        • 如果没有,输出1from_internet),并将该URL加入缓存。
      • 如果缓存已满,移除TTL最小的URL(如果TTL最小的URL有多个,按照先进先出移除)。
      • 更新缓存中所有URL的TTL,移除TTL为0的URL。
  4. 输出结果
    • 按照每秒的解析结果输出对应的01

代码

#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 ";}}
}

http://www.ppmy.cn/server/165934.html

相关文章

C++ Primer 递增和递减运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全

2月7日&#xff0c;启明星辰面向DeepSeek等企业级大模型业务服务者提供的安全防护产品——天清MAF&#xff08;Model Application Firewall&#xff09;大模型应用防火墙产品正式发布。 一个新赛道将被开启…… DeepSeek的低成本引爆赛道规模 随着DeepSeek成为当前最热的现象级…

【PyQt5 12】如何加载QT designer 设计的界面

一、动态加载UI文件 from PyQt5.QtWidgets import QApplication,QWidget from PyQt5 import uic import sys class MyWindow(QWidget):def __init__(self):# 从文件中加载UI定义super().__init__()self.ui uic.loadUi("my.ui")self.ui.button.clicked.connect(self…

async-http-client使用示例

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 async-http-client是一个用于 Java 平台的高性能、非阻塞 HTTP 客户端库&#xff0c;它允许开发者以异步的方式发送 HTTP 请求并处理响应&#xff0c;从而提高应用程序的性能和响应性。 主要特点 异步处理&#xff…

【零基础学Mysql】常用函数讲解,提升数据操作效率的利器

以耳倾听世间繁华&#xff0c;以语表达心中所想 大家好,我是whisperrrr. 前言&#xff1a; 大家好&#xff0c;我是你们的朋友whisrrr。在日常工作中&#xff0c;MySQL作为一款广泛使用的开源关系型数据库&#xff0c;其强大的功能为我们提供了便捷的数据存储和管理手段。而在…

【前端】【面试】【经典一道题】前端 Vue、React 采用单向数据流的原因

前端Vue、React采用单向数据流的原因 一、可预测性 1. 数据流向清晰 在单向数据流架构里&#xff0c;数据从父组件流向子组件的路径是明确且可预期的。 React示例&#xff1a;父组件通过 props 传递数据给子组件&#xff0c;子组件只能读取 props 中的数据&#xff0c;没有直…

快速对QWen2.5大模型进行微调

先看看训练结果&#xff1a; 目录 前言什么是LLaMA-Factory&#xff1f;安装LLaMA-Factory准备数据集配置微调参数运行微调脚本评估和保存模型使用微调后的模型可视化微调大模型总结 前言 在当今人工智能领域&#xff0c;大模型&#xff08;如LLaMA、GPT等&#xff09;的微调…

OpenCV4.8 开发实战系列专栏之 30 - OpenCV中的自定义滤波器

欢迎大家学习OpenCV4.8 开发实战专栏&#xff0c;长期更新&#xff0c;不断分享源码。 专栏代码全部基于C 与Python双语演示。 送相关学习资料, V&#xff1a; OpenCVXueTang_Asst 本文关键知识点&#xff1a;OpenCV中的自定义滤波器 图像卷积最主要功能有图像模糊、锐化、梯…