新C++(12):位图与海量数据处理

news2024/11/26 17:21:57

"无关利弊或对错,勇气一直在"


现在给你一道面试题:

给40亿个不重复的无符号整数,没有任何排序。给出一个无符号整数,如何快速地判断,该数是否存在于40亿多个这样的无符号整数之中?

唔……我想将这40亿个多数进行快排!得到一个有序序列,emm,然后可以通过二分查找,以LogN的效率查看该数是否存在……

emm,听起来不错,甚至我还想将这40多亿个整数放在红黑树、哈希表中查找……然而,真的可行嘛?

如果是红黑树结构来存储呢? 一个树的节点,最起码就包含三叉链(left,right,parent)。在64位系统中一个指针大小为8byte……想想看,这些庞大的数字堆积起来的内存空间是有多么可怖。

那是否我们就束手无策了呢? 肯定不是!


一、位图

(1)什么是位图结构呢?

位图,所谓bitmap,就是用 每一位来存放某种状态适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。 取自这里

我们简单地来举个例子:

此时,我们本来用一个4字节int或者1字节的char表示一个整数,变为用一个bit位来标识一个整数是否存在!

因此,用位图结构来处理大量数据时,对于存储数值在内存上的消耗能显著降低。那个面试题的答案也就自然而然能够解决了。

(2)STL位图

C++库中也提供了一份位图结构的数据结构。

二、位图实现

(1)构造函数

    template<size_t N>
    class bitset
    {
    public:
        bitset()
        {
            _bits.resize((N >> 3)+ 1);
        }
        
    private:
        std::vector<char> _bits;
    };

(2)set\reset

位图结构中,set、reset是最重要的。

        void set(size_t x) 
        {
            //第几块
            size_t i = x / 8;
            //第几个比特位
            size_t j = x % 8;

            _bits[i] |= (1 << j);
        }

        void reset(size_t x)
        {
            //第几块
            size_t i = x / 8;
            //第几个比特位
            size_t j = x % 8;
        
            _bits[i] &=~(1 << j);
        }

(3)test

这个接口用来测试,某一个数是否在这个位图中被标记了。

        bool test(size_t x)
        {
            //第几块
            size_t i = x / 8;
            //第几个比特位
            size_t j = x % 8;

            //如果该比特位 是0  返回的是false
            //否则返回 true
            return _bits[i] &= (1 << j);
        }

(4)测试

我们来测试看看吧~


三、位图的其他应用

100亿个整数,找出其中只出现一次的正数
变形:找出出现次数不超过2次的数

我们同样根据两个比特位标识状态:

00:没出现

01:出现一次

10:出现两次

11:出现多次

给两个文件,分别有100亿个整数,但是我们只有1G内存空间,如何找它们的交集。

找100亿个整数只能出现2^32-1个不重复的正数。创建的位图结构顶多占用的内存空间为512MB.

超过100G的日志文件,log中存有IP地址。找出出现次数最多的IP地址。

哈希切分

这样就结束了嘛?显然不是!试想一下,如果你的哈希函数转换的冲突IP地址够多!或者同一个IP地址访问的频率过高,你切分的1GB小文件装不下这些了,该怎么办???


总结:

当然处理大量数据文件,不仅仅用位图就能搞得定。比如文段最末的思想,用到了一种变形的哈希切割。面对什么样的场景,使用什么样的方法。前辈的经验,是我们前行的明灯。

本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~

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

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

相关文章

25- 卷积神经网络(CNN)原理 (TensorFlow系列) (深度学习)

知识要点 卷积神经网络的几个主要结构: 卷积层&#xff08;Convolutions&#xff09;: Valid :不填充&#xff0c;也就是最终大小为卷积后的大小. Same&#xff1a;输出大小与原图大小一致&#xff0c;那么N ​变成了​N2P. padding-零填充. 池化层&#xff08;Subsampli…

STM32HAL库1:认识时钟树(STM32F407)

目录 1.认识时钟树 1.1什么时钟 1.2认识时钟树 2.配置系统时钟 2.1系统适中的配置过程 2.2外设时钟使能和失能 2.3sys_stm32_clock_init函数&#xff08;F407&#xff09; 2.4SystemClock_Config函数&#xff08;F407&#xff09; [F1] [F4] 1.认识时钟树 1.1什么时钟 …

【禅道测试环境搭建及安装】Linux上的禅道安装教程,从环境搭建开始

目录 一、操作环境 二、安装VMware 三、安装FinalShell 四、在VMware里安装CentOS 1.前置&#xff1a;CentOS的下载 2.CentOS的安装 3.查看网络 五、用宿主机连接远程的虚拟机 六、禅道包的下载与CentOS配置的修改 七、上传项目包并安装禅道 一、操作环境 Windows 10…

Substrate 基础教程(Tutorials) -- 授权特定节点

五、授权特定节点 在添加可信节点中&#xff0c;您看到了如何使用一组已知的验证器节点构建一个简单的网络。该教程演示了一个简化版的许可网络&#xff08;permissioned network&#xff09;。在一个被许可的网络中&#xff0c;只有被授权的节点&#xff08;authorized nodes…

STM32CubexMX与FreeRTOS学习

FreeRTOS结合MX软件开发&#xff0c;基础配置直接生成&#xff0c;我们只需要会操作即可&#xff0c;操作一些API函数&#xff0c;注意事项就是&#xff1a;头文件、二值信号量一开始就有、定时器需要打开并且配置周期 1-LED-EXTI 上下拉模式和触发模式不要选择错误 void HAL_…

Elasticsearch:如何在 Elastic 中实现图片相似度搜索

作者&#xff1a;Radovan Ondas 在本文章&#xff0c;我们将了解如何通过几个步骤在 Elastic 中实施相似图像搜索。 开始设置应用程序环境&#xff0c;然后导入 NLP 模型&#xff0c;最后完成为你的图像集生成嵌入。 Elastic 图像相似性搜索概览 >> 如何设置环境 第一步…

【11】linux命令每日分享——useradd添加用户

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&…

网页全屏截图、在线截图API

在我们的数字时代&#xff0c;网页截图已经成为了一个非常常见的需求&#xff0c;无论是为了记录网页信息、保存重要信息或是与他人分享自己看到的内容&#xff0c;截图工具都是必不可少的。今天&#xff0c;我想向大家推荐一个非常好用的在线网页全屏截图工具&#xff0c;它的…

获取html元素相对屏幕的位置

1. 写在前面 Javascript 由三部分构成&#xff0c;ECMAScript&#xff0c;DOM和BOM。 ECMAScript(核心)   描述了JS的语法和基本对象 Bom:(browser object model&#xff09;&#xff1b;浏览器对象模型&#xff0c;提供一些属性和方法可以操作浏览器&#xff0c;浏览器可…

【spring】Spring Data --Spring Data JPA

Spring Data 的委托是为数据访问提供熟悉且符合 Spring 的编程模型&#xff0c;同时仍保留着相关数据存储的特​​殊特征。 它使使用数据访问技术、关系和非关系数据库、map-reduce 框架和基于云的数据服务变得容易。这是一个伞形项目&#xff0c;其中包含许多特定于给定数据库…

详述java的设计模式(二)

1.工厂模式 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;属于创建型模式&#xff0c;是指由一个工厂类根据传入的参数&#xff0c;动态决定应该创建哪一个产品类的对象&#xff0c;而被创建的对象通常都具有共同的父类或接口&#xff0c;这种模式又叫做静态工…

数据结构和算法学习

文章目录精通一个领域切题四件套算法算法的五个条件流程图数据结构数据与信息数据信息数据结构和算法数据结构算法时间复杂度空间复杂度数组 Array优点缺点数组和链表的区别时间复杂度链表 Linked List优点缺点时间复杂度单向链表双向链表循环链表双向循环链表堆栈 Stack队列 Q…

涂鸦开发资源中心硬核上线!支持产物包可视化、自由裁剪开发框架等功能

开发过程对于程序猿们来说&#xff0c;就像建碉堡&#xff0c;碉堡的建成速度、创造力&#xff0c;以及精致和牢固程度&#xff0c;取决于工具称不称手。不称手的开发工具&#xff0c;不仅能让人心力交瘁&#xff0c;还会多掉几根头发。 为了帮助开发者获得更好的开发体验&…

【搞透C语言指针】那年我双手插兜, 不知道指针是我的对手

☃️内容专栏&#xff1a;【C语言】进阶部分 ☃️本文概括&#xff1a; 征服C语言指针&#xff01;一篇文章搞清楚指针的全部要点。 ☃️本文作者&#xff1a;花香碟自来_ ☃️发布时间&#xff1a;2023.3.3 目录 一、字符指针 二、指针数组 三、数组指针 1.数组指针的定义…

UML常见图的总结

一、概述 UML&#xff1a;Unified Modeling Language&#xff0c;统一建模语言&#xff0c;支持从需求分析开始的软件开发的全过程。是一个支持模型化和软件系统开发的图形化语言、为软件开发的所有阶段提供模型化和可视化支持&#xff0c;包括由需求分析到规格&#xff0c;到…

ESP32设备驱动-SHT11温度湿度传感器驱动

SHT11温度湿度传感器驱动 SHT1x 数字湿度传感器是一种可回流焊接的传感器。 SHT1x 系列包括带有 SHT10 湿度传感器的低成本版本、带有 SHT11 湿度传感器的标准版本和带有 SHT15 湿度传感器的高端版本。 与 SHTxx 湿度传感器系列中的所有其他 Sensirion 传感器类型一样,它们经…

H2数据库连接时用户密码错误:Wrong user name or password [28000-214] 28000/28000 (Help)

H2数据库连接时用户密码错误: 2023-03-03 08:25:07 database: wrong user or password; user: "SA" org.h2.message.DbException: Wrong user name or password [28000-214]出现的问题配置信息原因解决办法org.h2.message.DbException: Wrong user name or password …

Python从入门到转行,看完这一篇就够了

Python零基础入门 零基础入门就得从最基本的变量&#xff0c;语法格式&#xff0c;数据类型&#xff0c;函数&#xff0c;作用域&#xff0c;模块等基本知识入手&#xff08;有编程基础基础也得这么来&#xff09; 和篮球一样&#xff0c;先来三步上篮&#xff1a; Python基…

Spring Boot 分片上传、断点续传、大文件上传、秒传

文件上传是一个老生常谈的话题了&#xff0c;在文件相对比较小的情况下&#xff0c;可以直接把文件转化为字节流上传到服务器&#xff0c;但在文件比较大的情况下&#xff0c;用普通的方式进行上传&#xff0c;这可不是一个好的办法&#xff0c;毕竟很少有人会忍受&#xff0c;…

MySQL面试题-基础篇

目录 前言 数据库基础 1.什么是关系型数据库和非关系型数据库&#xff1f; 2.什么是 SQL&#xff1f; 3.MySQL 有什么优点&#xff1f; 4.MySQL 的基础架构? 存储引擎 1.MySQL 支持哪些存储引擎&#xff1f;默认使用哪个&#xff1f; 2.MySQL 存储引擎架构了解吗&…