『 C++ 』海量数据处理

news2025/3/13 3:31:41

文章目录

    • 🦖 快速找出海量数据中是否存在该整型数据
    • 🦖 有限内存情况下两个文件(海量query)中找出交集
    • 🦖 海量数据中找出只出现1次的数据
    • 🦖 有限内存情况下两个文件(整型)找出交集
    • 🦖 海量数据中找出出现次数不超过2次的数据
    • 🦖 海量数据中找出topK的IP

请添加图片描述


🦖 快速找出海量数据中是否存在该整型数据

请添加图片描述

在上篇文章『 C++ - STL 』位图(BitMap)与布隆过滤器(Bloom Filter)-CSDN博客中提到一题关于腾讯的面试题;

  • 存在40亿个不重复的无符号整数,且无符号整数没排过序,给定一个无符号整数,如何快速判断一个数是否存在40亿数据当中;

这种题型为判断一个数据是否存在的问题,在C++STL当中首先可以考虑set,unordered_set用于判断数据是否存在;

但是这题出现了另一个关键字 40亿 ;

  • 这意味着数据不能直接存储至内存当中

    40亿个无符号整型在32位的机器下大小约为16GB;

    在一般的机器下无法能够完全将该数据量的数据存储至内存当中;

当然也可以使用以下思路:

  • 排序+二分查找

    先对数据进行排序,再使用二分查找的思路对数据进行甄别;

    排序的时间复杂度最理想的情况其时间复杂度为O(NlogN);

    二分查找的时间复杂度为logN;

  • 逐个数据进行遍历

    使用逐个数据进行遍历的方式时间复杂度为O(N);

尽管上述方式都能使其在40亿个数据中判断该数据是否存在,但整体效率过低;

在这种情况下即可以使用在『 C++ - STL 』位图(BitMap)与布隆过滤器(Bloom Filter)-CSDN博客 文章中所使用的位图;

以其使用位运算的方式将原数据大小为16GB缩减至512MB,且使用位图的时间复杂度基本上为常数级别O(1);


🦖 有限内存情况下两个文件(海量query)中找出交集

请添加图片描述

  • 存在两个文件,分别有100亿个query,我们只有1GB内存,如何找到两个文件交集?

    假设1个query的大小为50byte,一个文件100亿个query的大小则为 5000亿byte;

    5000亿byte换算大小大约为500GB;

在这种情况下可以使用 分割 的方式将文件 分割 为若干个小文件;

以当前情况为例,该题中限制内存大小为1GB,则可以将文件 分割 为若干个约500MB大小的小文件;

再将各个小文件放置于内存当中的set或者unordered_set容器当中判断其交集;

但是若是将文件进行平均切分,在遍历时只能采用暴力枚举的方式,对于检查的效率将会低至 O(N2) ,即每个文件都需要遍历另一组的所有小文件从而找出其中的交集;

  • 而在这种情况为了避免该情况发生可以使用类似哈希桶的方式使大文件分割成小文件

    遍历每个大文件,并使用一个哈希函数将文件中的各个query进行区分至各个小文件内;

    如: i = HashFunc(query) % 1000

在使用该方式之后只需要将Ai文件与Bi文件放置不同的setunordered_set并寻找交集即可;

在使用该方法对两个大文件进行处理的优势是,由于使用了哈希函数所以具有冲突或者完全相同的query将会放置在对应下标的小文件当中,从而可以使得进行比较寻找交集,一般这种方式被称作 哈希切割 ;

但是使用这种方式也会出现对应的问题:

  • 将数据放置在setunordered_set当中可能会出现 抛异常 bad_alloc

    这是因为采用 哈希切割 的切割方式,该方式并不是使得文件像上文所述的 平均切 方式从而导致了单个文件过大而不能完全加载进内存当中;

    以该图为例(A1文件与B1文件过大);

在这种文件过大的情况下通常有两种情况:

  • 文件内存在大量不同且冲突的query;
  • 文件中存在大量相同的query;

若是出现文件内存在大量不相同且出现哈希冲突的query时则换另一个哈希函数对该小文件重新进行 哈希切割 再次分成若干个小文件即可即可;

而文件中存在大量相同的query时,由于set或者unordered_set容器具有去重的功能,所以在一般情况下文件中存在大量相同query的情况时并不会抛出内存异常,只需要插入至对应的set或者unordered_set容器即可;

  • 那么如何控制使得可以灵活进行 哈希切割 或是载入内存?

    set容器与unordered_set容器在插入数据时,将会出现三种情况:

    • 插入成功

      当数据插入成功时将会返回pair,其中pair内存在对应的迭代器以及true;

    • 插入失败

      当数据存在时将会返回pair,其中pair内存在对应的迭代器以及false;

    • 插入失败(抛异常)

      当内存不够时程序将抛出异常bad_alloc;

    只需要灵活对异常进行处理则可以实现灵活进行 哈希切割 或是载入内存进行后续操作;


🦖 海量数据中找出只出现1次的数据

请添加图片描述

  • 存在100亿个整数,找出只出现一次的整数;

该题为找出只出现一次的数据;

那么该思路可以使用 位图 进行解答;

因为数据量为100亿,而整型的最大值为 232-1,故数据中必然存在大量的重复数值,而位图当中可以精确计算数据对应的是否存在问题,其最大数据为 232-1 ;

而位图中由于数据的存在表示为二进制01进行表示,故在此处只使用一个位图并不能很好的解决该问题;

而若是使用两个位图进行映射则可以表示4种情况,分别为00,01,10,11;

class bits{
    public:
  		void set(const int n);
    	void reset(const int n);
    private:
    std::bitset<-1> _bits1;
    std::bitset<-1> _bits2;
};

根据数据的情况以此对两个位图分别进行set操作即可;

在该题中可以将数据分为以下情况:

  • 数据不存在

    当数据不存在时不需要进行set操作,其对应映射为00;

  • 数据存在一个

    当数据对应的映射为00时遍历到该数据时将其对应映射位置set01,表示该数据出现一次;

  • 数据存在两个及以上

    当数据对应的映射为01时再次遍历到相同数据将其对应映射位置set10,表示数据出现过不止一次;

    当数据持续出现时且当前对应数据映射为10时保持不变(由于只需要判断只出现过 1次 的数据,不需要其他冗余操作);

最后检查位图对应的映射即可找出只出现一次的数据;


🦖 有限内存情况下两个文件(整型)找出交集

请添加图片描述

  • 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

该题与上文中 有限内存情况下两个文件(海量query)中找出交集 题目类似,即在有限内存当中找出两个文件海量数据中的交集;

唯一不同的是该题的数据类型为整型;

由于整型的最大值为 232-1,而给定的文件的数据数据量分别有100亿个,故两个文件中都必然存在大量的重复数值;

在这种情况中只需要使用位图即可以解决:

  • 使用两个位图

    定义两个位图,两个位图都对应着其中一个文件;

    位图可进行映射与去重的操作,可将两个文件遍历并映射至位图当中进行去重;

    最终比较两个位图找出其中对应的交集;

  • 使用一个位图

    定义一个位图,该位图对应两个文件中的其中一个文件;

    遍历一个文件将该文件中的所有数据映射至位图当中;

    再次遍历另外一个文件,当遇到相同值时保存该值(该数据为交集),并将该数据对应的映射置为0,即reset操作;

两种方式对应的都有它的优缺点;

若是不需要频繁找其交集时可采用 方法2 寻找交集;

而若是需要频繁找数据的交集时则可以采用 方法1 从而降低每次访问文件的时间;


🦖 海量数据中找出出现次数不超过2次的数据

请添加图片描述

  • 1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

该题与上文中 海量数据中找出只出现1次的数据 题目类似,且可以使用相同的模型进行解答;

由于在 海量数据中找出只出现1次的数据 题中所采用的模型为2个位图进行实现,其可以控制00,01,10,11四种情况;

在该题中且只需要该几种情况即可;

  • 数据不存在

    当该数据不存在时其对应两个位图的映射为00;

  • 数据出现1次

    当该数据对应的映射为00,且遍历至该数据时,将该数据置为01,表示数据出现1次;

  • 数据出现2次

    当该数据对应的映射为01,且遍历至该数据时,将该数据置为10,表示数据出现2次;

  • 数据出现3次及以上

    当该数据对应的映射为10,且遍历至该数据时,将该数据置为11,表示数据出现3次;

    当数据对应映射位置为11,且遍历至该数据时不采取措施,表示该数据出现3次或3次以上;


🦖 海量数据中找出topK的IP

请添加图片描述

  • 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?与上题条件相同,如何找到top K的IP?

该题的解法与上文中 有限内存情况下两个文件(海量query)中找出交集 中的解决方式类似;

由于文件过大且类型为字符串类型,故不能采用位图进行操作;

再处理该题时则可以使用上文中出现的 哈希切割 的方式将大文件分成若干个小文件;

使用哈希函数遍历大文件中的IP,并对其使用哈希函数并放置在对应的小文件当中;

将切分后的小文件采用map或者unordered_map统计其出现次数(相同或者冲突的IP将会存放至同一个文件内);

在遍历小文件的过程当中可能会出现抛内存异常bad_alloc;

当出现抛该异常时说明在遍历小文件的过程中某个文件中的数据量过大;

此时说明该小文件中冲突的数据(IP)过多,导致的无法将小文件完全读取至内存当中;

此时只需要换一个哈希函数再次对该小文件进行 哈希切割 成更小的文件进行遍历即可;

并对其使用哈希函数并放置在对应的小文件当中;

将切分后的小文件采用map或者unordered_map统计其出现次数(相同或者冲突的IP将会存放至同一个文件内);

在遍历小文件的过程当中可能会出现抛内存异常bad_alloc;

当出现抛该异常时说明在遍历小文件的过程中某个文件中的数据量过大;

此时说明该小文件中冲突的数据(IP)过多,导致的无法将小文件完全读取至内存当中;

此时只需要换一个哈希函数再次对该小文件进行 哈希切割 成更小的文件进行遍历即可;

而对于题目当中的对于Top K问题则可以建一个小堆Heap从而实现Top K的问题;

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

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

相关文章

CleanMyMac X好不好用?如何下载2024最新版本

CleanMyMac X是一款好用的系统优化软件&#xff0c;具有简洁的界面和多样的功能&#xff0c;能够支持系统垃圾、图片、邮件、iTunes清理&#xff0c;移除恶意软件&#xff0c;优化系统和释放多余空间等。 CleanMyMac X全新版下载如下: https://wm.makeding.com/iclk/?zoneid4…

Python算法题集_随机链表的复制

Python算法题集_随机链表的复制 题138&#xff1a;随机链表的复制1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【双层循环】2) 改进版一【字典哈希】3) 改进版二【单层哈希】4) 改进版三【递归大法】 4. 最优算法 本文为Python算法题集之一的…

Open CASCADE学习|TopoDS_Vertex与gp_Pnt相互转化

目录 gp_Pnt TopoDS_Vertex 关系和转换 使用场景 在Open CASCADE Technology (OCCT)中&#xff0c;TopoDS_Vertex和gp_Pnt是两种不同的数据类型&#xff0c;用于表示三维空间中的点。它们有不同的用途和特性&#xff1a; gp_Pnt gp_Pnt是OCCT几何库&#xff08;Geom&…

使用RegNet替换YOLOX中原始的Backbone

使用mmdetection 中的RegNet bcakbones替换YOLOX中原始的Backbone 将mmdet/models/backbones/regnet.py中相关的代码复制到YOLOX中&#xff0c;并进行适配 注意通道数要适配 in_channels [64, 160, 384] &#xff0c;可以通过调试后&#xff0c;先运行到后后端输出结果出&a…

算法练习-01背包问题【含递推公式推导】(思路+流程图+代码)

难度参考 难度&#xff1a;困难 分类&#xff1a;动态规划 难度与分类由我所参与的培训课程提供&#xff0c;但需 要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0…

阿里云香港轻量应用服务器网络线路cn2?

阿里云香港轻量应用服务器是什么线路&#xff1f;不是cn2。 阿里云香港轻量服务器是cn2吗&#xff1f;香港轻量服务器不是cn2。阿腾云atengyun.com正好有一台阿里云轻量应用服务器&#xff0c;通过mtr traceroute测试了一下&#xff0c;最后一跳是202.97开头的ip&#xff0c;1…

RK3399平台开发系列讲解(USB篇)U盘等存储类设备

🚀返回专栏总目录 文章目录 一、什么是U盘等存储类设备二、U盘设备传输数据结构三、U盘识别需要打开的宏沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍U盘等存储类设备。 一、什么是U盘等存储类设备 USB Mass Storage Device Class(USB MSC/UMS) USB大容量存…

如何在Linux系统中配置并优化硬盘的RAID

在Linux系统中配置和优化硬盘的RAID技术可以帮助提高数据存储性能和安全性。RAID&#xff08;Redundant Array of Independent Disks&#xff09;技术通过将多个硬盘组合起来&#xff0c;以增加性能、容量或冗余度&#xff0c;提高数据的可靠性和可用性。本文将介绍如何在Linux…

嵌入式学习-C++-Day6

思维导图 作业 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一…

【机构vip教程】Unittest(1):unittest单元测试框架简介

unittest单元测试框架简介 unittest是python内置的单元测试框架&#xff0c;具备编写用例、组 织用例、执行用例、功能&#xff0c;可以结合selenium进行UI自动化测 试&#xff0c;也可以结合appium、requests等模块做其它自动化测试 官方文档&#xff1a;https://docs.pytho…

【计算机网络】P2P应用

将会在两个例子中得出结果 1&#xff0c;对等文件分发 &#xff1b;2&#xff0c;大型对等方社区中的服务器 P2P文件分发 自拓展性 直接成因是&#xff1a;对等方除了是比特的消费者外还是它们的重新分发者BitTorrent 一个用于文件分发的P2P协议洪流 torrent 参与一个特定文件…

day34打卡

day34打卡 860. 柠檬水找零 解法&#xff0c;贪心&#xff1a;局部最优&#xff1a;遇到账单20&#xff0c;优先消耗美元10&#xff0c;完成本次找零 -》全局最优&#xff1a;完成全部账单的找零。 遇到5&#xff0c;直接收下遇到10&#xff0c;找一个5元遇到20&#xff0c;…

CS50x 2024 - Lecture 6 - Python

00:00:00 - Introduction 00:01:01 - Python print("hello world")与c的显著差异 1.不必显式包含标准库 2.不再需要定义main函数 00:07:24 - Speller 00:13:41 - Filter from PIL import Image, ImageFilterbefore Image.open("bridge.jpg") after…

山西电力市场日前价格预测【2024-02-15】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-15&#xff09;山西电力市场全天平均日前电价为168.98元/MWh。其中&#xff0c;最高日前电价为366.42元/MWh&#xff0c;预计出现在18:30。最低日前电价为0.00元/MWh&#xff0c;预计出…

黑马程序员-瑞吉外卖day9

菜品分类下拉列表 CategoryController里面写 /*** 根据条件查询分类数据** param category* return*/GetMapping("/list")ApiOperation("菜品分类目录")public R<List<Category>> list(Category category) {List<Category> list cate…

洛夫克拉夫特“克苏鲁神话”艺术风格探索(一)

克苏鲁神话引入中国时间不长&#xff0c;研究的规模也不如国外大&#xff0c;但克苏鲁神话作为神话史、奇幻小说史上的重要节点&#xff0c;有很大的影响力与非常重要的研究意义。为了促进中文语境下克苏鲁神话元素的使用和创作、更好地设计克苏鲁的呼唤游戏模组&#xff08;剧…

0206-1-网络层

第 4 章 网络层 网络层提供的两种服务 虚电路服务 数据报服务 概要: 虚电路服务与数据报服务的对比 网际协议 IP 网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。与 IP 协议配套使用的还有四个协议&#xff1a; 地址解析协议 ARP (Address Resolution Protocol)逆地…

【论文精读】SimCLR2

摘要 本文提出了一个半监督学习框架&#xff0c;包括三个步骤&#xff1a;无监督或自监督的预训练&#xff1b;有监督微调&#xff1b;使用未标记数据进行蒸馏。具体改进有&#xff1a; 发现在半监督学习&#xff08;无监督预训练有监督微调&#xff09;中&#xff0c;对于较大…

嵌入式day24

开课复工啦~ 冲冲冲&#xff01; 文件IO&#xff1a; read函数和write函数&#xff1a; &#x1f4da; write 接口有三个参数&#xff1a; fd&#xff1a;文件描述符buf&#xff1a;要写入的缓冲区的起始地址&#xff08;如果是字符串&#xff0c;那么就是字符串的起始地址&…

语义分割-基础知识

1.cls_iou计算: cls0_iou预测正确的像素个数/&#xff08;预测为该类别的像素个数真实标签为该类别的像素个数-预测正确的像素个数&#xff09; mean_iou各个类别的像素预测准确值相加/像素总个数2.转置卷积(Transposed Convolution) 转置卷积不是卷积的逆运算 转置卷积也是卷…