【模拟】P11043 [蓝桥杯 2024 省 Java B] 分布式队列 题解

P11043 蓝桥杯 2024 省 Java B 分布式队列 题解

题目传送门:P11043 分布式队列

一、题目描述

分布式队列包含 N 个节点(编号 0 至 N-1 ,0 号为主节点),主节点负责添加元素,副节点负责同步主节点的队列。元素只有在被所有节点同步后才具有可见性。需要处理三种操作:

  1. add element:主节点添加元素
  2. sync follower_id:指定副节点同步下一个缺失元素
  3. query:查询当前具有可见性的元素数量

二、题目分析

这道题模拟了一个分布式队列的同步过程,关键在于理解"可见性"的定义:一个元素只有在被所有节点(包括主节点和所有副节点)同步后才是可见的。

三、解题思路

  1. 使用数组a维护每个节点的队列状态
  2. add操作只在主节点(0号节点)的队列末尾添加元素
  3. sync操作让指定副节点同步主节点的下一个元素
  4. query操作时,找到所有副节点中最小的队列长度,这就是已完全同步的元素数量

四、算法讲解

算法:模拟算法

原理:

  • 主节点维护完整队列
  • 每个副节点通过sync操作逐步同步主节点的元素
  • 可见元素数量由"木桶效应"决定,即所有副节点中同步最慢的那个

实现步骤:

  1. 初始化N个节点的队列
  2. 处理每个操作:
    • add:主节点队列追加元素
    • sync:副节点从主节点同步下一个元素
    • query:计算所有副节点最小队列长度

例子 :

如样例中,当所有节点都同步了前3个元素时,query结果为3。

五、代码实现

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
// #define int long long
const int N = 12;
void solve()
{
    int n;
    cin >> n;
    vector<vector<int>> a(n); // 每个节点的队列
    string s;
    while (cin >> s)
    {
        int x;
        if (s == "add")
        {
            cin >> x;
            a[0].push_back(x); // 只在主节点添加元素
        }
        else if (s == "sync")
        {
            cin >> x;
            int len = a[x].size();
            a[x].push_back(a[0][len]); // 副节点同步主节点的下一个元素
        }
        else // query操作
        {
            if (n == 1) // 只有主节点特殊情况
            {
                cout << a[0].size() << "\n";
                continue;
            }
            int len = 1e9;
            for (int i = 1; i < n; i++) // 找所有副节点最小队列长度
            {
                len = min(len, (int)a[i].size());
            }
            cout << len << "\n";
        }
    }
}
signed main()
{
    // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    solve();
    return 0;
}

六、重点细节

  1. 可见性判断:一个元素在所有节点中都存在才算可见,因此取所有副节点队列长度的最小值
  2. 边界情况:当N=1时(只有主节点),所有添加的元素都立即可见
  3. 同步顺序:副节点按顺序同步主节点的元素,不能跳过

七、复杂度分析

  • 时间复杂度:O(q*N),q是操作数,N是节点数。每个query需要遍历所有副节点。
  • 空间复杂度:O(q),最坏情况下所有操作都是add,主节点需要存储所有元素。

八、总结

这道题通过模拟分布式队列的同步过程,考察了对队列操作和同步机制的理解。关键点在于正确维护每个节点的队列状态,并在查询时正确计算已被所有节点同步的元素数量。

相关推荐
真上帝的左手27 分钟前
30. 技术专题-‌应用框架组件-搜索引擎-ES
大数据·分布式·elasticsearch·搜索引擎·中间件
8Qi814 小时前
DDD架构演进
java·分布式·mvc·ddd
方方洛15 小时前
ray教程-23-附录C-术语表
人工智能·分布式·机器学习
海棠Flower未眠1 天前
下单请求处理流程:商品维度分布式锁与 Redis 预扣库存
redis·分布式·junit
罗四强1 天前
第10篇:打包上架:签名、打包 HAP、发布到华为应用市场
分布式·操作系统·harmonyos·arkts·鸿蒙系统
秋饼1 天前
Redis 全面解析:从数据结构到主从/哨兵/集群、分布式锁与面试高频考点,代码到原理一次讲透
数据库·redis·分布式·面试·后端开发
二月夜1 天前
Redis 高频面试题全解:缓存三大问题、大 key 治理与分布式锁之争(2026 招聘 JD 真题复盘)
redis·分布式·后端·缓存
樱花落木兰1 天前
Redis 消息队列的可靠性演进:从 List、Pub/Sub 到 Stream 消费者组,以及 8.x 版本改变了什么
java·开发语言·经验分享·redis·分布式·python·软件工程
真上帝的左手1 天前
12. 消息队列-Kafka进阶
分布式·中间件·kafka
Thanks_ks2 天前
Cookie 和 Session 到底是什么关系——登录态是怎么维持的
分布式·http·jwt·cookie·session·后端开发·登录态