对于海量数据这个词,大家不难理解吧。主要是针对给定的数据量特别大,占用内存特别大的情况。那么和位图有什么关系呢。看下面一个腾讯的海量数据的例子吧。

例:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。

对于这道题,我们给了40亿个不重复的无符号整数,一个整数是4个字节,那么就是40*4=160亿个字节,大概是16G的内存。显然在内存上时存不下的。那么我们怎么来查找呢。既然是不重复,就说明整数要么就不出现,要么就出现一次。整数的最大值是42亿多,即2^32。此时我们就可以用每一位来表示这个数存在或者不存在。如果将32位为一个编号时,原本16G的数据使用位图可以节省到500M的空间。大概我们刚刚学过哈希表,用访问地址的方法来快速的查找出地址对应的值。这里也一样,用到了哈希表中的新的解决海量数据的方法---位图

那么问题来了?什么是位图呢?

我们用每一位标志这个数存在的状态,设为0(不存在)和1(存在);

位图的基本结构:

是一个size_t类型的vector数组;

vector<size_t> _array;

位图的基本函数:

对于判断一个无符号整数,是否存在这40亿个数中。

(1)需要存入这40亿个数,使用Set将对应的40亿个位置为1;

(2)使用Test将判断某个位是否为0或1;

注:位图只是考虑了整数类型

位图的实现代码:(vs2013)

#pragma once
#include<iostream>
using namespace std;
#include<vector>//位图的每一位的0,1标志这个数存在或不存在的状态
class BitMap
{
public:BitMap(size_t Size = 1024){_array.resize(Size/32+1);}~BitMap(){}public://将这个数存在的状态置为1void Set(const size_t& value){size_t index = value>>5;size_t bit = value % 32;_array[index] |= (1<<bit);}//将这个数不存在的状态置为0void Reset(const size_t& value){size_t index = value>>5;size_t bit = value % 32;_array[index] &= (~(1<<bit));}//测试某个数是否出现过bool Test(const size_t& value){size_t index = value>>5;size_t bit = value % 32;return (_array[index] & (1<<bit));}
private:vector<size_t> _array;
};void BitMapTest()
{BitMap bm(size_t(-1));   //64位系统下表示的整数的最大值bm.Set(10);bm.Set(100);bm.Set(20);bm.Set(500);cout<<bm.Test(10)<<endl;cout<<bm.Test(200)<<endl;cout<<bm.Test(500)<<endl;cout<<bm.Test(40)<<endl;
}

运行结果:

海量数据处理--位图(BitMap)相关推荐

  1. 海量数据处理——位图法bitmap

    海量数据处理--位图法bitmap 一.定义        位图法就是bitmap的缩写.所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况.通常是用来判断某个 ...

  2. 海量数据处理:BitMap

    利用Java里的BitSet位集合实现: 有四十亿个扣扣号,拿来一个扣扣号,最快速查找? 一.问题描述: 1.在42亿个qq号码中,如何使用O(1)时间复杂度去查找一个QQ号是否存在. 2.qq号的位 ...

  3. 海量数据处理之 Bit-map 详细讲解

    现在有这么一个问题:现存在 20 亿个数字,需要知道哪些数字没有出现在里面.这个问题你可能觉得一个 for 循环就能解决.但是有两个问题,第一个就是for循环效率的问题,第二个问题就是 20 亿个数字 ...

  4. 海量数据处理算法—Bit-Map

    1. Bit Map算法简介 来自于<编程珠玑>.所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空 ...

  5. 海量数据处理(位图和布隆过滤器)

    哈希切割 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现 解决思路 ...

  6. 位图布隆过滤器海量数据处理

    位图&布隆过滤器&海量数据处理 文章目录 位图&布隆过滤器&海量数据处理 一.位图 二.布隆过滤器 三.海量数据处理 一.位图 1. 位图概念: 所谓位图,就是用每一位 ...

  7. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  8. 十七道海量数据处理面试题与Bit-map详解

    前言 本博客内曾经整理过有关海量数据处理的10道面试题(十道海量数据处理面试题与十个方法大总结),此次除了重复了之前的10道面试题之后,重新多整理了7道.仅作各位参考,不作它用. 同时,程序员编程艺术 ...

  9. 10道海量数据处理的面试题

    说明:本文分为俩部分,第一部分为10道海量数据处理的面试题,第二部分为10个海量数据处理的方法总结. 出处:http://blog.csdn.net/v_JULY_v. 第一部分.十道海量数据处理面试 ...

最新文章

  1. You must provide a username via either --os-username or env[OS_USERNAME]
  2. HDU4273(求三维凸包重心到表面的最短距离)
  3. photoshop是用什么编程语言开发的_为什么中国开发不出流行的操作系统和编程语言?...
  4. security 底层原理_spring security 实现remeber me(免登陆功能)的原理
  5. Bootstrap富文本编辑器-bootstrap-wysiwyg
  6. LeetCode MySQL 178. 分数排名(dense_rank连续排名)
  7. R与Python或协同助力机器学习:听Azure ML Studio讲座有感
  8. JDBC操作数据库的问题总结
  9. 数字图像处理理论课件(清华大学计算机科学与技术系)
  10. stm32f072--定时器17使用CH1N通道输出pwm时没有波形的原因
  11. 技术负责人如何带领好团队
  12. 如何下载微信公众号的音频文件
  13. 电脑下载速度一快电脑就卡的问题解决
  14. 使用Axure完成交互式UI设计
  15. 中国移动号码手机开机以及注册gprs流程
  16. java开发抢红包算法,抢红包算法的实现-java
  17. 瘦客户端那些事 - 开篇
  18. 20230407 定时闹钟
  19. Android简易计算器的制作
  20. 利用JavaScript生成点名册

热门文章

  1. java连接oracle数据库 -- jdbc连接
  2. 传128GB版iPad4售价为799/929美元
  3. 再次参加(第七届)商学院徒步戈壁挑战赛,赋词几首
  4. 计算机网络层实验路由表苏州科技,苏州科技大学计算机网络实验报告课案.docx...
  5. es安全组端口_从零开始在远程服务器(Linux)上搭建es,eshead和ik分词器
  6. linux电脑做笔记软件,知识管理工具, 自由格式数据库, 笔记软件以及个人信息管理...
  7. 搭建自动安装的linux,RedHat7搭建无人值守自动安装Linux操作系统(PXE+Kickstart)
  8. c语言中栈堆,C语言中堆和栈的区别
  9. java 菜单 分隔符_在Java中使用分隔符连接值列表最优雅的方法是什么?
  10. 如何保证input的输入值不会随着提交 而变空_如何对web界面的应用进行测试?