[C/C++] -- 海量数据查重

例如:50亿int整型数,以及一台可用内存为400M的机器,时间复杂度要求O(n),统计只出现一次的数。

需要一种能够在满足 O(n) 时间复杂度要求的同时,使用尽可能少的内存来解决问题。

在处理海量数据时,分治思想是一种常用的策略。它的基本思想是将一个大问题分解成许多小问题,然后逐个解决这些小问题,最后将结果合并起来得到原始问题的解。这种方法可以有效地降低问题的复杂度,并使得问题更容易处理。

分治思想在处理海量数据时通常会按照以下步骤进行:

  1. 数据分割: 将海量数据划分成多个较小的数据块。这可以根据数据的特点来进行划分,比如按照数据范围、数据哈希值、数据的某种属性等。

  2. 并行处理: 将每个数据块分配给不同的处理单元或线程进行处理。这样可以利用并行处理的优势,提高处理效率。

  3. 局部处理: 在每个数据块上应用分治思想,将问题进一步分解成小问题,并在局部范围内解决。

  4. 结果合并: 将每个数据块上的处理结果合并起来,得到原始问题的解。

分治思想的优点在于可以将大问题分解成小问题,并且可以充分利用并行处理的优势,提高处理效率。但是在实际应用中,需要注意数据块的划分方式、合并策略以及并行处理的管理等问题,以确保整个处理过程的正确性和效率。

分析:

50亿 5G*4(4字节)=20G*2 = 40G(哈希表还得*2)

分治法:大文件划分成小文件,使得每一个小文件能够加载到内存中,

    求出对应的重复元素,把结果写入到一个存储重复元素的文件中

    大文件-》小文件个数(40G/400M=120个小文件)

遍历大文件的元素,把每一个元素根据哈希映射函数,放到对应序号的小文件当中

    data % 127 = file_index

    值相同的,通过一样的哈希映射函数,肯定是放在同一个小文件中的

int main()
{//.dat格式高效存储二进制数据FILE *pf1 = fopen("data.dat","wb");for (int i = 0;i < 200000;++i){int data = rand();fwrite(&data,4,1,pf1);}fclose(pf1);//打开存储数据的原始文件data.datFILE *pf = fopen("data.dat","rb");if(pf==nullptr)return 0;//这里由于原始数据量缩小,所以这里文件划分个数也变小,11个小文件const int FILE_NO = 11;FILE *pfile[FILE_NO] = {nullptr};for(int i = 0;i<FILE_NO;++i){char filename[20];sprintf(filename,"data%d.dat",i+1);//将格式化后的字符串写入到目标字符数组中pfile[i] = fopen(filename,"wb+");}//哈希映射,把大文件中的数据,映射到各个小文件中int data;while (fread(&data,4,1,pf)>0){int findex = data % FILE_NO;//将数据依据哈希映射分配到不同文件fwrite(&data,4,1,pfile[findex]);}//定义一个链式哈希表unordered_map<int,int> numMap;//先定义一个小根堆using P = pair<int,int>;using FUNC = function<bool(P&,P&)>;using MinHeap = priority_queue<P,vector<P>,FUNC>;//自定义小根堆元素的大小比较方式MinHeap minheap([](auto &a,auto &b)->bool{return a.second>b.second;});// 分段求解小文件的top 10大的数字,并求最终结果for(int i = 0;i < FILE_NO;++i){//恢复小文件的文件指针到起始位置,确保读取或写入操作从文件开头开始fseek(pfile[i],0,SEEK_SET);//这里直接统计了数字重复的次数while (fread(&data,4,1,pfile[i]) >0){numMap[data]++;}int k = 0;auto it = numMap.begin();//如果堆是空的,先往堆放10个数据if(minheap.empty()){//先从map表中读10个数据到小根堆中,建立top 10的小根堆,最小的元素在堆顶for(;it!=numMap.end()&&k<10;++it,++k){minheap.push(*it);}}//把K+1到末尾的元素进行遍历,和堆顶元素比较for(;it!=numMap.end();++it){//如果map表中当前元素重复次数大于堆顶元素的重复次数,则替换堆顶元素if(it->second>minheap.top().second){minheap.pop();minheap.push(*it);}}numMap.clear();}//堆中剩下的就是重复次数最大的前k个while(!minheap.empty()){auto &pair = minheap.top();cout<<pair.first<<" : "<<pair.second<<endl;minheap.pop();}
#if 0//用vec存储要处理的数字vector<int> vec;for(int i = 0;i<200000;++i){vec.push_back(rand());}//统计所有数字的重复次数,key:数字的值,value:数字重复的次数unordered_map<int,int> numMap;for(int val:vec){numMap[val]++;}//先定义一个小根堆  数字-》重复次数using P = pair<int,int>;using FUNC = function<bool(P&,P&)>;using MinHeap = priority_queue<P,vector<P>,FUNC>;//自定义小根堆元素的大小比较方式MinHeap minheap([](auto &a,auto &b)->bool{return a.second>b.second;});//先往堆放k个数据。int k = 0;auto it = numMap.begin();//先从map表中读10个数据到小根堆中,建立top 10的小根堆,最小的元素在堆顶for(;it!=numMap.end()&&k<10;++it,++k){minheap.push(*it);}// 把K+1到末尾的元素进行遍历,和堆顶元素比较for(;it!=numMap.end();++it){if(it->second>minheap.top().second){minheap.pop();minheap.push(*it);}}//堆中剩下的就是重复次数最大的前k个while(!minheap.empty()){auto &pair = minheap.top();cout<<pair.first<<" : "<<pair.second<<endl;minheap.pop();}
#endifreturn 0;
}

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

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

相关文章

【Keil备忘录】Keil MDK Warning: L6989W 数学计算函数警告问题

文章目录 1. 发生的场景2. 警告内容3.警告含义4.警告屏蔽解决尝试5. 警告消除解决尝试 1. 发生的场景 stm32L4系列使用数学库时遇到 2. 警告内容 Warning: L6989W: Could not apply patch sdcomp-29491-629360 to instruction VPOP {d8-d13} at offset 0x54, instructio…

浏览器curl请求快速转换为python request 请求

Python 中的 requests 库将浏览器复制的 cURL 命令转换为请求对象。下面是一个示例&#xff1a; import requestscurl_command """curl -X GET \http://example.com/api/data \-H Content-Type: application/json \-H Cookie: udide9ceb2bb9a6bebb401fcddf5c9…

实践指南:如何将 SpringBoot 项目无缝部署到 Tomcat 服务器

序言 SpringBoot 是一个用来简化 Spring 应用初始搭建以及开发过程的框架&#xff0c;我们可以通过内置的 Tomcat 容器来轻松地运行我们的应用。但在生产环境中&#xff0c;我们可能需要将应用部署到独立的 Tomcat 服务器上。本文给大家介绍 SpringBoot 项目部署到独立 Tomcat…

2024速通python之python进阶

文章目录 一、数据容器1.list列表&#xff08;1&#xff09;定义&#xff08;2&#xff09;常用方法 2.元组&#xff08;1&#xff09;定义 3.字符串常用操作汇总&#xff08;1&#xff09;根据下标索引取出特定位置字符&#xff08;2&#xff09;查找给定字符的第一个匹配项的…

三:哈希map day6 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

今日任务 ● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数 ● 1. 两数之和 今日任务 242.有效的字母异位词 题目 大型概括&#xff1a;map 的使用 1.题目描述-->思路&#xff1a; 给出两个string s,t; …

Android Update Engine 分析(二十九)如何进行连续多个版本的升级?

本文为洛奇看世界(guyongqiangx)原创,转载请注明出处。 原文链接:https://blog.csdn.net/guyongqiangx/article/details/138849767 0. 背景 关于如何连续进行多个版本升级,这是一个很常见的需求,也是 OTA 讨论群里试不试就会讨论的一个话题。 例如,昨天一个小伙伴在群里…

a-auto-complete 请求后端数据做模糊查询,解决下拉框选择选不上,不回显的问题

a-auto-complete 请求后端数据做模糊查询&#xff0c;解决下拉框选择选不上&#xff0c;不回显的问题 记录一个a-auto-complete卡bug卡了两天&#xff0c;找不到哪里的问题下拉框选择选不上&#xff0c;不回显&#xff0c;最后终于解决了。 我还对下拉框显示的内容做了小调整。…

MYSQL数据库默认的系统库详解

文章目录 [TOC](文章目录) MYSQL数据库默认的系统库详解1、information_schema(数据库)2、mysql3、performance_schema &#xff08;性能库&#xff09;4、sys MYSQL数据库默认的系统库详解 1、information_schema(数据库) 1、记录了用户、表、视图等元数据信息。这个库是虚拟…

越来越真的Deepfake再次引起网安界的关注

当地时间5月6日&#xff0c;全球网络安全领域最受关注的年度盛会 RSAC 2024在美国旧金山隆重开幕。当天&#xff0c;被誉为“安全圈奥斯卡”的创新沙盒大赛也决出了冠军&#xff0c;Reality Defender凭借其创新性的深度伪造&#xff08;Deepfake&#xff09;检测平台摘得桂冠&a…

【漏洞复现】泛微OA E-Cology users.data信息泄露漏洞

漏洞描述&#xff1a; 泛微OA E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology users.data存在敏感信息泄露漏洞&#xff0c;攻击者利用此漏洞可以获取…

Excel 根据包含的关键词将指定列按关键词指定顺序排列

例题描述和简单分析 有 Excel 文件&#xff0c;数据如下所示&#xff1a; AB1Parent ColumnModifier (Column)2Jack lives in the villageRose3As mentioned by jackVillage4Rose already spoke to jack about last nightJack5Rose left the village6rose was their yesterda…

DigitalOcean 应用托管更新:应用端到端运行时性能大幅改进

DigitalOcean 希望可以为企业提供所需的工具和基础设施&#xff0c;以帮助企业客户加速云端的开发&#xff0c;实现业务的指数级增长。为此 DigitalOcean 在 2020 年就推出了App Platform。 App Platform&#xff08;应用托管&#xff09; 是一个完全托管的 PaaS 解决方案&…

ubuntu下使用docker安装kafka

1.先安装zookeeper docker run -d --restartalways -e ALLOW_ANONYMOUS_LOGINyes --log-driver json-file --log-opt max-size100m --log-opt max-file2 --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime bitnami/zookeeper:latest 2.安装kafka docker run…

Docker 的 Ubuntu 操作系统镜像

Debian 和 Ubuntu 都是目前较为流行的 Debian 系列 的服务器操作系统&#xff0c;十分适合研发场景。 Debian 和 Ubuntu 属于同一系列的发行版。Debian 是由 Ian Murdock 在 1993 年创建的最初的发行版。Ubuntu 是 Mark Shuttleworth 在 2004 年基于 Debian 创建的发行版。 Li…

2024 National Invitational of CCPC (Zhengzhou)(CCPC郑州邀请赛暨CCPC河南省赛)

2024 National Invitational of CCPC (Zhengzhou) 2024CCPC郑州邀请赛暨CCPC河南省赛 2024 National Invitational of CCPC (Zhengzhou) B. 扫雷 1 题意&#xff1a;扫n轮雷&#xff0c;每轮开始获得一枚扫雷币&#xff0c;可保存&#xff0c;从第一轮开始&#xff0c;可以…

27.C++的类型转换(介绍了static_cast、reinterpret_cast、const_cast、dynamic_cast的用法)

1. C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收返回值类型不一致时&#xff0c;就需要发生类型转化&#xff0c;C语言中总共有两种形式的类型转换&#xff1a;隐式类型转换…

JavaScript中的call、apply和bind方法(2)

JavaScript中的call、apply和bind方法是用于改变函数执行上下文和预先设置参数的强大工具。它们在编写可维护和优雅的代码时起到了重要的作用。本文将介绍这些方法的原理和使用场景&#xff0c;并展示如何将它们应用于你的代码中&#xff0c;使其更加漂亮。 call方法的原理和使…

STM32 CANFD 基础知识留档

讲得比较细的文章但可能有问题自行判定 附1 附2 前言 CAN2.0 协议中数据段波特率和仲裁段波特率默认是一致&#xff0c;因此只需要关注传输波特率即可 CANFD 协议是向下兼容 CAN2.0 的数据通讯&#xff0c;因此实际使用中需要配置 STM32H7 系列支持的标准是 Compliant with …

大语言模型中上下文长度扩展技术的内容、原因和方式-综述

24年1月阿联酋科技创新研究院、孟加拉国伊斯兰科技大学、斯坦福大学、亚马逊公司和南卡大学AI研究院的论文“The What, Why, and How of Context Length Extension Techniques in Large Language Models – A Detailed Survey“。 LLM通常面临上下文长度外推方面的限制。 理解…

C++11 线程池:轻量级高并发解决方案

C11 线程池&#xff1a;轻量级高并发解决方案 线程池&#xff08;Thread Pool&#xff09;是一种线程管理的机制&#xff0c;它包含了多个预先创建的线程&#xff0c;用于执行多个任务&#xff0c;这些任务被放入任务队列中等待执行。 满足我们的生产者和消费者模型。 线程…