关于set,map以及变种
|关联容器| set&multiset | map&multimap |无序关联容器| Unordered set&multiset | Unordered map&multimap |
建议先了解之后再配合练习
这次练习CCF真题比较多,也比较基础,预计耗时不用这么久。

今天的重点是 C++ STL 中两个非常强大的关联式容器:mapset。它们在处理需要高效统计、去重和查找的场景时极为有用,尤其在CCF认证考试的题目中频繁出现。

练习计划概览

  • 总时长: 约 4 小时

  • 核心目标:

    1. 掌握 std::map 的基本用法,用于建立键-值(key-value)映射,实现快速词频统计和数据聚合。

    2. 掌握 std::set 的基本用法,利用其自动去重和排序的特性,进行数据去重和有序集合操作。

    3. 理解 mapset 底层基于红黑树实现所带来的 O(log n) 时间复杂度特性。

    4. 通过练习CCF真题,熟悉这类考点的设问方式和解题套路。


第一部分:map 的应用——统计与映射 (约 2 小时)

map 提供的是键(Key)到值(Value)的映射关系。它非常适合需要根据某个标识(如单词、ID)来存储和查询对应信息(如出现次数、属性)的场景。

题目编号题目名称核心知识点练习目标
CCF202403-1词频统计map, set这是最经典的词频统计题。使用 map<int, int> 统计单词总频次,并可结合 set 对每篇文章的单词去重,以统计单词出现的文章数 1。是 mapset 结合使用的绝佳练习。(来自您提供的文件)
CCF202305-1重复局面map, vector<string>统计每个 8x8 棋盘局面出现的次数 2。本题是练习将 vector<string> 等复杂数据结构作为 map 的键,来进行频次统计的绝佳题目。(来自您提供的文件)
CCF202006-2稀疏向量map<int, int>这道题是 map 应用的绝佳范例。由于向量维度很高但非零值很少(稀疏) 3,使用数组会浪费巨大空间。而用 map 只存储非零值的下标和值,可以高效地解决空间和计算问题 4。 (CCF真题)
CCF202312-2因子化简map在对整数进行质因数分解时,使用 map<long long, int> 来存储每个质因数及其出现的次数(指数)5,是 map 在数论问题中进行频次统计的典型应用。(来自您提供的文件)
//33-1 (第33次第一题)
//构建两个map来映射,也可以吧两个合成一个map<int,vector<int>>来操作,但我觉得没必要#include <iostream>
#include <map>
#include <vector>using namespace std;int main(){int m,n;cin >> n >> m;map<int,int> freq;map<int,int> arti;for(int i=1;i<=m;i++){freq.insert(make_pair(i,0));arti.insert(make_pair(i,0));}while(n--){int a;cin >> a;vector<bool> vis(m,false);for(int i=0;i<a;i++){int tmp;cin >> tmp;freq[tmp]++;if(!vis[tmp]){arti[tmp]++;vis[tmp] = true;}}}for(int i=1;i<=m;i++){cout << arti[i] << " " << freq[i] <<"\n";}return 0;
}``````cpp
//30-1 直接无脑把各种情况往映射里面插入就行。#include <iostream>
#include <vector>
#include <map>  
#include <string>using namespace std;int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;map<vector<string>,int> freq;for(int i=0;i<n;i++){vector<string> situ(8);for(int j=0;j<8;j++){cin >> situ[j];}if(freq.find(situ)==freq.end()){freq[situ]=1;}else{freq[situ]++;}cout << freq[situ] <<"\n";}return 0;
}
//19-2 写两个map,数据传入后直接乘#include <iostream>
#include <vector>
#include <map>  
#include <string>using namespace std;int main(){int n,a,b;cin >> n >> a >> b;map<int,int> vc1;map<int,int> vc2;for(int i=0;i<a;i++){int tmp;cin >> tmp;cin >> vc1[tmp];}for(int i=0;i<b;i++){int tmp;cin >> tmp;cin >> vc2[tmp];}long long sum=0;// 遍历第一个向量中的所有索引for(auto& p : vc1){int index = p.first;if(vc2.find(index) != vc2.end()){sum += (long long)p.second * vc2[index];}}cout << sum << "\n";return 0;
}
//素数我直接打表的,注意一个可能本身是大数的情况,所以加了一步flag#include <iostream>
#include <vector>
#include <map>  
#include <string>
#include <sstream>
#include <math.h>std::vector<int> pri={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,701,709,719,727,733,739,743,751,757,761,769,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};
using namespace std;int main(){int n;cin >> n;while(n--){long long a;int k;map<int,int> freq;cin >> a >> k;while(a>1){bool flag = false;for(int i=0;i<pri.size()&&a>=pri[i];i++){if(a%pri[i]==0){if(freq.find(pri[i])==freq.end()){freq[pri[i]]=1;}elsefreq[pri[i]]++;a/=pri[i];flag = true;break;}}if(!flag){if(freq.find(a)==freq.end())freq[a]=1;elsefreq[a]++;break;}}long long b = 1;for(auto& p : freq){if(p.second>=k){b *= pow(p.first,p.second) ;}}cout << b << "\n";}return 0;
}

练习建议:

  • CCF202403-1 (词频统计) 是必做题,它完美地体现了CCF对 map 基本能力的考察。请务必掌握 map[key]++ 这种简洁的计数方式。

  • CCF202305-1 (重复局面) 时,关键在于理解C++中 map 的键只要是可比较的,就可以是任意复杂类型。这为你解决更多样的问题打开了思路。

  • CCF202006-2 (稀疏向量) 时,需要遍历其中一个 map,然后用 findcount 方法在另一个 map 中查找是否存在相同的 key(维度下标),从而计算内积。


第二部分:set 的应用——去重与查找 (约 1.5 小时)

set 容器存储的元素都是唯一的,并且会自动排序。它非常适合需要去除重复元素,或者需要快速判断某个元素是否在集合中的场景。

题目编号题目名称核心知识点练习目标
P1059[NOIP2006 普及组] 明明的随机数set最经典的去重入门题。将所有数字插入 set 容器,它会自动完成去重和排序,是理解 set 核心特性的不二之选。
CCF202403-2相似度计算set, string题目核心是“去掉各自重复的单词”并计算交集与并集 6。这是 set 数据结构的教科书式应用,用于高效地进行字符串去重和集合运算。(来自您提供的文件)
P3370【模板】字符串哈希set<string>统计一堆字符串中有多少个不同的字符串。可以直接使用 std::set<string> 来自动去重并计数,是 set 用于字符串去重的模板题。
P1540[NOIP2010 提高组] 机器翻译set/map, queue模拟内存缓存。需要一个数据结构能快速判断某单词是否存在于内存中,setfindcount 方法非常适合这个场景。
P1059 -这个题目我在排序和二分那里用set做了一遍
//33-2 两个点:大小写转换记得用引用;这里用无序容器更好,因为基于哈希的无序容器查找耗时O(1)#include <iostream>
#include <set>
#include <string>using namespace std;int main(){int a,b;cin >> a >> b;set<string> s1;set<string> s2;for(int i=0;i<a;i++){string tmp;cin >> tmp;for(char &c : tmp){c = tolower(c);}s1.insert(tmp);}for(int i=0;i<b;i++){string tmp;cin >> tmp;for(char &c : tmp){c = tolower(c);}s2.insert(tmp);}set<string> s3;for(auto& p : s1){if(s2.find(p)!=s2.end()){s3.insert(p);}}cout << s3.size() << endl << s1.size()+s2.size()-s3.size() << endl;return 0;
}
//P3370 - 题目想要你自己搞哈希,既然有现成容器直接用就行#include <iostream>
#include <set>
#include <string>using namespace std;int main(){int n;cin >> n;set<string> s;while(n--){string tmp;cin >> tmp;s.insert(tmp);}cout << s.size() << endl;return 0;
}
//P1540 - 我这里了个queue来进行内存里面数据的处理(先进先出),因为删除set里面东西的时候只能找key,愿意的话可以用u_map然后把key顺序一下,每次删最前面就行。(我觉不如queue实在)#include <iostream>
#include <unordered_set>
#include <string>
#include <deque>using namespace std;int main(){int m,n;int rst=0;cin >> m >> n;unordered_set<int> s;deque<int> q;while(n--){int i;cin >> i;if(s.find(i)==s.end()){s.insert(i);q.push_back(i);rst++;if(q.size()>m){s.erase(q.front());q.pop_front();}}}cout << rst << endl;return 0;
}

练习建议:

  • P1059CCF202403-2 是必做题,它们分别代表了对数字和字符串的去重,覆盖了 set 最核心的应用。

  • 在做 CCF202403-2 (相似度计算) 时,在将两个单词集合(set)构建好之后,可以通过遍历较小的集合,并使用 find 方法在较大的集合中查找,来高效地计算交集的大小。

  • P1540 是一个很好的综合题,它会让你思考 set 只负责去重和查找,但不记录顺序,因此需要结合 queue等其他数据结构来记录元素的进入次序。


目标达成自查 (约 0.5 小时)

完成以上练习后,进行复盘和总结:

  1. 关于 map vs 数组:

    • 在什么情况下必须使用 map 而不能用数组?(当键的类型不是整数,或者键是整数但范围非常大且分布稀疏时)

    • mapm[key]++ 操作包含了哪些步骤?(查找 key,如果不存在则插入默认值0,然后自增)

  2. 关于 set vs vector+sort+unique:

    • 使用 set 去重和使用 vector 排序去重各有什么优缺点?(set 插入时自动维护,代码简单;vector 操作对于静态数据一次性处理速度可能更快)

    • 如何用 set 快速判断一个元素是否存在?(使用 s.count(element)s.find(element) != s.end(),时间复杂度为 O(log n))

  3. 复杂度意识:

    • mapset 中一次插入、删除、查找操作的平均时间复杂度是多少?(O(log n))

    • 对于 10^5 级别的数据量,使用 mapset 的总时间复杂度大约是多少?(O(n log n)),这在绝大多数算法竞赛中是可以接受的。

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

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

相关文章

【智谱清言-GLM-4.5】StackCube-v1 任务训练结果不稳定性的分析

1. Prompt 我是机器人RL方向的博士生正在学习ManiSkill&#xff0c;在学习时我尝试使用相同命令训练同一个任务&#xff0c;但是我发现最终的 success_once 指标并不是相同的&#xff0c;我感到十分焦虑&#xff0c; 我使用的命令如下&#xff1a; python sac.py --env_id&qu…

MySQL 8.0 主从复制原理分析与实战

MySQL 8.0 主从复制原理分析与实战半同步复制设计理念&#xff1a;复制状态机——几乎所有的分布式存储都是这么复制数据的基于全局事务标识符&#xff08;GTID&#xff09;复制GTID工作原理多主模式多主模式部署示例课程目标&#xff1a; MySQL 复制&#xff08;Replication&a…

[UT]记录case中seq.start(sequencer)的位置变化带来的执行行为的变化

现象&#xff1a; 代码选择打开57行&#xff0c;注释掉60行执行&#xff0c;结果58行不会打印。 代码选择打开60行&#xff0c;注释57行执行&#xff0c;结果58行正常打印。 sequence的执行需要时间&#xff01;&#xff01;&#xff01; SV中代码57行切换到60行的区别&#xf…

利用keytool实现https协议(生成自签名证书)

利用keytool实现https协议&#xff08;生成自签名证书&#xff09;什么是https协议&#xff1f;https&#xff08;安全超文本传输协议&#xff09;是 HTTP 的安全版本&#xff0c;通过 SSL/TLS 加密技术&#xff0c;在客户端&#xff08;如浏览器&#xff09;和服务器之间建立加…

拆解 AI 大模型 “思考” 逻辑:从参数训练到语义理解的核心链路

一、引言&#xff1a;揭开 AI 大模型 “思考” 的神秘面纱​日常生活中的 AI 大模型 “思考” 场景呈现&#xff08;如 ChatGPT 对话、AI 写作辅助、智能客服应答&#xff09;​提出核心问题&#xff1a;看似具备 “思考” 能力的 AI 大模型&#xff0c;其背后的运作逻辑究竟是…

element plus 使用细节 (二)

接上一篇文章&#xff1a; element plus 使用细节 最近菜鸟忙于系统开发&#xff0c;都没时间总结项目中使用的问题&#xff0c;幸好还是在空闲之余总结了一点&#xff08;后续也会来补充&#xff09;&#xff0c;希望能给大家带来帮助&#xff01; 文章目录table fixed 的 v…

【机器学习学习笔记】numpy基础2

零基础小白的 NumPy 入门指南如果你想用电竞&#xff08;打游戏&#xff09;的思路理解编程&#xff1a;Python 是基础操作键位&#xff0c;而 NumPy 就是 “英雄专属技能包”—— 专门帮你搞定 “数值计算” 这类复杂任务&#xff0c;比如算游戏里的伤害公式、地图坐标&#x…

从自动化到智能化:家具厂智能化产线需求与解决方案解析

伴随着工业4.0浪潮和智能制造技术的成熟&#xff0c;家具行业正逐步从传统的自动化生产迈向智能化生产。智能化产线的构建不仅可以提升生产效率&#xff0c;还能满足个性化定制和柔性制造的需求。本文以某家具厂为例&#xff0c;详细解析智能化产线的核心需求&#xff0c;并提出…

macOS下基于Qt/C++的OpenGL开发环境的搭建

系统配置 MacBook Pro 2015 Intel macOS 12Xcode 14 Qt开发环境搭建 Qt Creator的下载与安装 在Qt官网的下载页面上下载&#xff0c;即Download Qt Online Installer for macOS。下载完成就得到一个文件名类似于qt-online-installer-macOS-x64-x.y.z.dmg的安装包。 下一步 …

当液态玻璃计划遭遇反叛者:一场 iOS 26 界面的暗战

引子 在硅谷的地下代码俱乐部里&#xff0c;流传着一个关于 “液态玻璃” 的传说 —— 那是 Apple 秘密研发的界面改造计划&#xff0c;如同电影《变脸》中那张能改变命运的面具&#xff0c;一旦启用&#xff0c;所有 App 都将被迫换上流光溢彩的新面孔。 而今天&#xff0c;我…

探究Linux系统的SSL/TLS证书机制

一、SSL/TLS证书的基本概念 1.1 SSL/TLS协议简介 SSL/TLS是一种加密协议&#xff0c;旨在为网络通信提供机密性、完整性和身份验证。它广泛应用于HTTPS网站、电子邮件服务、VPN以及其他需要安全通信的场景。SSL&#xff08;安全套接字层&#xff09;是TLS&#xff08;传输层安全…

python和java爬虫优劣对比

Python和Java作为爬虫开发的两大主流语言&#xff0c;核心差异源于语法特性、生态工具链、性能表现的不同&#xff0c;其优势与劣势需结合具体场景&#xff08;如开发效率、爬取规模、反爬复杂度&#xff09;判断。以下从 优势、劣势、适用场景 三个维度展开对比&#xff0c;帮…

Unity 枪械红点瞄准器计算

今天突然别人问我红点瞄准器在镜子上如何计算&#xff0c;之前的吃鸡项目做过不记得&#xff0c;今天写个小用例整理下。 主体思想记得是目标位置到眼睛穿过红点瞄准器获取当前点的位置就可以。应该是这样吧&#xff0c;&#xff1a;&#xff09; 武器测试结构 首先整个结构&am…

题解 洛谷P13778 「o.OI R2」=+#-

文章目录题解代码居然没有题解&#xff1f;我来写一下我的抽象做法。 题解 手玩一下&#xff0c;随便画个他信心的折线图&#xff0c;如下&#xff1a; 可以发现&#xff0c;如果我们知道终止节点&#xff0c;那么我们就可以知道中间有多少个上升长度。&#xff08;因为它只能…

RTSP流端口占用详解:TCP模式与UDP模式的对比

在音视频传输协议中&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff0c;实时流传输协议&#xff09;被广泛用于点播、直播、监控等场景。开发者在实际部署或调试时&#xff0c;常常会遇到一个问题&#xff1a;一路 RTSP 流到底占用多少个端口&#xff1f; 这…

websocket的key和accept分别是多少个字节

WebSocket的Sec-WebSocket-Key是24字节&#xff08;192位&#xff09;的Base64编码字符串&#xff0c;解码后为16字节&#xff08;128位&#xff09;的原始随机数据&#xff1b;Sec-WebSocket-Accept是28字节&#xff08;224位&#xff09;的Base64编码字符串&#xff0c;解码后…

单片机开发----一个简单的Boot

文章目录一、设计思路**整体框架设计****各文件/模块功能解析**1. main.c&#xff08;主程序入口&#xff0c;核心控制&#xff09;2. 隐含的核心模块&#xff08;框架中未展示但必备&#xff09;**设计亮点**二、代码bootloader.hbootloader.cflash.cmain.c一、设计思路 整体…

Day2p2 夏暮客的Python之路

day2p2 The Hard Way to learn Python 文章目录day2p2 The Hard Way to learn Python前言一、提问和提示1.1 关于raw_input()1.2 关于input()二、参数、解包、变量2.1 解读参数2.2 解读解包2.3 解读变量2.4 实例2.5 模块和功能2.6 练习前言 author&#xff1a;SummerEnd date…

【C++设计模式】第二篇:策略模式(Strategy)--从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析

C设计模式系列文章目录 【第一篇】C单例模式–懒汉与饿汉以及线程安全 【C设计模式】第二篇&#xff1a;策略模式&#xff08;Strategy&#xff09;--从基本介绍&#xff0c;内部原理、应用场景、使用方法&#xff0c;常见问题和解决方案进行深度解析一、策略模式的基本介绍1.…

四十岁编程:热爱、沉淀与行业的真相-优雅草卓伊凡

四十岁编程&#xff1a;热爱、沉淀与行业的真相-优雅草卓伊凡今日卓伊凡收到一个问题&#xff1a;「如何看待40岁还在撸代码的程序员&#xff1f;」这让我不禁思考&#xff1a;从何时起&#xff0c;年龄成了程序员职业中的敏感词&#xff1f;在互联网的某些角落&#xff0c;弥漫…