ITPub博客

首页 > 大数据 > 数据分析 > C++哈希应用-位图/布隆过滤器/海量数据处理

C++哈希应用-位图/布隆过滤器/海量数据处理

原创 数据分析 作者:vjvj1101 时间:2022-04-16 15:22:04 0 删除 编辑

C++位图/布隆过滤器/海量数据处理

零、前言

一、位图

1、位图概念

2、位图接口的介绍以及实现

3、位图的应用

二、布隆过滤器

1、布隆过滤器概念和介绍

2、布隆过滤器的操作及实现

3、布隆过滤器的分析

三、海量数据处理

零、前言

本章主要讲解C++中对哈希的应用有关方面的内容,位图,布隆,海量数据处理


一、位图

1、位图概念

位图概念:

位图其实就是哈希的变形,同样通过映射来处理数据,只不过位图本身并不存储数据,而是存储标记


通过一个比特位来标记这个数据是否存在,1代表存在,0代表不存在


位图通常情况下用在数据量庞大,且数据不重复的情景下判断某个数据是否存在


相关面试题描述:

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


注意:

遍历时间复杂度O(N);排序(O(NlogN))利用二分查找: logN;这两种方式除了效率不够高,还有个问题是内存无法完全同时加载这给40亿个不重复的无符号整数


10亿个整数为40亿字节,而10亿字节为1G,所以40亿个整数需要16G大小空间


位图解决方案:

数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态


那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在


示图:小端平台上


2、位图接口的介绍以及实现

bitset中常用的成员函数如下:

成员函数 功能

set 设置指定位或所有位

reset 清空指定位或所有位

flip 反转指定位或所有位

test 获取指定位的状态

count 获取被设置位的个数

size 获取可以容纳的位的个数

any 如果有任何一个位被设置则返回true

none 如果没有位被设置则返回true

all 如果所有位都被设置则返回true

使用示例:

#include <iostream>

#include <bitset>

using namespace std;


int main()

{

bitset<8> bs;

bs.set(2); //设置第2位

bs.set(4); //设置第4位

cout << bs << endl; //00010100

bs.flip(); //反转所有位

cout << bs << endl; //11101011

cout << bs.count() << endl; //6

cout << bs.test(3) << endl; //1

bs.reset(0); //清空第0位

cout << bs << endl; //11101010

bs.flip(7); //反转第7位

cout << bs << endl; //01101010

bs.reset(); //清空所有位

cout << bs.none() << endl; //1

bs.set(); //设置所有位

cout << bs.all() << endl; //1

return 0;

}


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

注:使用成员函数set、reset、flip时,若指定了某一位则操作该位,若未指定位则操作所有位


位图的简单实现:

对于底层来说一个位代表一个数的映射,那么我们以char类型来开辟对应需要空间,同时用vector进行管理


对于开辟空间,一个char类型有8个位,所以需要个数/8即为需要开辟的大小,但是整数相除为向下取整,所以需要我们多开一个空间出来


实现代码:

template<size_t N>

class bitset

{

public:

bitset()

{

_bits.resize(N / 8 + 1,0);//开辟空间并置为0

//_bits.resize((N >> 3) + 1,0);

}

bool test(size_t x)

{

size_t i = x / 8;//处于的该数组的第几个空间

size_t j = x % 8;//处于的该空间的第几个比特位


return _bits[i] & (1 << j);

}


void set(size_t x)

{

size_t i = x / 8;//处于的该数组的第几个空间

size_t j = x % 8;//处于的该空间的第几个比特位


_bits[i] |= (1 << j);//该位置置为1

}


void reset(size_t x)

{

size_t i = x / 8;//处于的该数组的第几个空间

size_t j = x % 8;//处于的该空间的第几个比特位


_bits[i] &= (~(1 << j));//该位置置为0

}

private:

vector<char> _bits;

};


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

3、位图的应用

快速查找某个数据是否在一个集合中


排序


求两个集合的交集、并集等


操作系统中磁盘块标记


二、布隆过滤器

1、布隆过滤器概念和介绍

布隆过滤器的提出:

我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的?


用服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录


如何快速查找:

用哈希表存储用户记录,缺点:浪费空间


用位图存储用户记录,缺点:不能处理哈希冲突


将哈希与位图结合,即布隆过滤器


布隆过滤器概念:

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构


特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”


它是用多个哈希函数,将一个数据映射到位图结构中的不同位置上,不仅可以提升查询效率,也可以节省大量的内存空间




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70016760/viewspace-2887455/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2022-04-16

  • 博文量
    14
  • 访问量
    3878