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

简介: C++哈希应用-位图/布隆过滤器/海量数据处理(1)

零、前言


本章主要讲解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;
}


注:使用成员函数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;
};


3、位图的应用


  1. 快速查找某个数据是否在一个集合中
  2. 排序
  3. 求两个集合的交集、并集等
  4. 操作系统中磁盘块标记
相关文章
|
2天前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
20 5
|
3月前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
3月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
90 2
|
4月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
35 3
|
5月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
64 2
|
5月前
|
存储 搜索推荐 Serverless
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
45 1
|
5月前
|
JSON Android开发 C++
Android c++ core guideline checker 应用
Android c++ core guideline checker 应用
|
2天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
32 18
|
2天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
30 13
|
2天前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
17 5