当前位置: 首页 > news >正文

【CSP】202403-1词频统计

文章目录

      • 算法思路
        • 1. 数据结构选择
        • 2. 输入处理
        • 3. 统计出现的文章数
        • 4. 输出结果
      • 代码示例
      • 代码优化

在这里插入图片描述
样例输入

4 3
5 1 2 3 2 1
1 1
3 2 2 2
2 3 2

样例输出

2 3
3 6
2 2

算法思路

1. 数据结构选择
  • vector<int>:用于存储每篇文章的单词列表(可能包含重复)。
  • unordered_set<int>:用于统计每篇文章中出现的不同单词(自动去重)。
  • 两个统计数组:
    • totalCount[i]:记录单词i在所有文章中的总出现次数。
    • articleCount[i]:记录单词i出现在多少篇文章中。
2. 输入处理
  • 读取文章数n和单词上限m:确定处理范围。
  • 逐篇处理文章:
    • 读取文章长度l
    • 读取l个单词,并存入words数组。
    • 遍历words数组,累加每个单词的总出现次数到totalCount
3. 统计出现的文章数
  • 使用集合去重:
    • words数组中的单词存入unordered_set,自动去除重复。
    • 遍历集合中的每个单词,将其对应的articleCount加 1(每篇文章只统计一次)。
4. 输出结果
  • 按单词编号1m的顺序,输出每个单词的articleCounttotalCount

代码示例

#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;

int main(){
	int n,m;//n篇文章,单词编号上限m 
	cin>>n>>m; 
	vector<int> totalCount(m+1,0);//单词i在文章中的总出现次数
	vector<int> articleCount(m+1,0);//单词i出现在多少篇文章中
	
	//遍历每一篇文章
	for(int i=0;i<n;i++){ 
		int l;//当前文章的单词数量 
		cin>>l; 
		
		//存储当前文章的所有单词
		vector<int> words(l); 
		for(int j=0;j<l;++j){
			cin>>words[j];//读取每个单词
			//更新总出现次数,每出现一次就加1
			totalCount[words[j]]++; 
		}
		
		//使用集合统计当前文章中出现的不同单词(自动去重)
		unordered_set<int> seen;
		for(int word:words){
			seen.insert(word);//插入集合自动去重 
		} 
		
		//遍历集合中的单词,统计出现的文章数
		for(int word:seen){
			articleCount[word]++;//每篇文章只算一次 
		} 
	}
	
	//输出结果:按单词编号1到m依次输出
	for(int i=1;i<=m;++i){
		cout<<articleCount[i]<<" "<<totalCount[i]<<endl;
	} 

	return 0;
} 

代码优化

  1. 减少不必要的vector存储

原代码中使用vector<int> words(l)来存储每篇文章的所有单词,实际上可以直接在读取单词时进行统计,无需额外存储,这样可以减少内存使用。

  1. 减少集合的插入操作

在统计文章中出现的不同单词时,可以在读取单词时判断是否已经在集合中,避免不必要的插入操作

【代码示例】

#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;

    vector<int> totalCount(m + 1, 0);   // 总出现次数(1-based)
    vector<int> articleCount(m + 1, 0); // 出现的文章数(1-based)

    for (int i = 0; i < n; ++i) {
        int l;
        cin >> l;  // 读取文章长度

        unordered_set<int> seen;
        for (int j = 0; j < l; ++j) {
            int word;
            cin >> word;
            totalCount[word]++;  // 累加总次数
            if (seen.find(word) == seen.end()) {
                seen.insert(word);
                articleCount[word]++;  // 如果是第一次出现,更新文章数
            }
        }
    }

    // 输出结果(1-based)
    for (int i = 1; i <= m; ++i) {
        cout << articleCount[i] << " " << totalCount[i] << endl;
    }

    return 0;
}

优化点解释

  • 去掉了vector<int> words(l),直接在循环中读取每个单词并进行统计,减少了内存开销。
  • 在读取单词时,先使用seen.find(word)判断单词是否已经在集合中,如果不在则插入集合并更新articleCount,减少了集合的插入操作和后续遍历集合的操作。
http://www.dtcms.com/a/112663.html

相关文章:

  • Haskell语言的云安全
  • Linux文件处理三剑客详解-grep,sed,awk
  • 如何使用 Puppeteer 解决 reCAPTCHA 并提高成功率
  • TDengine 快速上手:安装部署与基础 SQL 实践(一)
  • TypeScript语言的操作系统原理
  • FPGA实验记录
  • VSCode远程连接
  • WebSocket 详解:构建一个复杂的实时聊天应用
  • acme.sh管理 SSL/TLS 证书
  • 使用PyTorch训练VGG11模型:Fashion-MNIST图像分类实战
  • 0302useState-hooks-react-仿低代码平台项目
  • AingDesk是一款简单好用的AI助手,支持知识库、模型 API、分享、联网搜索、智能体,它正在迅速发展和改进
  • 电机控制学习路线
  • SpringCloud(25)——Stream介绍
  • 4.4 力扣|59螺旋矩阵II
  • AI与Python在地球科学多源数据交叉融合中的前沿
  • MCP(模型上下文协议)入门指南:用Web开发的视角理解下一代AI引擎
  • 集合与容器:List、HashMap(II)
  • 用 Docker Compose 与 Nginx 反向代理部署 Vikunja 待办事项管理系统
  • Leetcode 135 -- 贪心 | 拓扑排序
  • 【多线程-第四天-自己模拟SDWebImage的下载图片功能-下载操作管理类 Objective-C语言】
  • 如何排查、定位 SQL 慢查询及其优化策略
  • 16进制在蓝牙传输中的应用
  • 检查 Python 中的可迭代对象是否相等
  • Bethune X 6发布:为小规模数据库环境打造轻量化智能监控巡检利器
  • 字符串-JS
  • 基于 Hough 变换的直线检测2025.4.1
  • 大数据笔试题_第一阶段配套笔试题01
  • 浅谈AI落地 - 文章推荐 - 混合推荐模型
  • 【CF】Day24——Codeforces Round 994 (Div. 2) D