当前位置:   article > 正文

【数据结构 10】位图

【数据结构 10】位图

一、位图

在海量数据的标记的时候,比如数十亿上百亿上千亿的数据,我们要统计数据是否出现,直接存储数据的话对内存的消耗太大了,这时我们可以通过位图来标记出现过的数据,位图可以标记0~42亿之间的整型数据,我们也可通过复用多个位图实现统计数据出现的次数。

二、布隆过滤器

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也
可以节省大量的内存空间。

布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特
位一定为1。所以可以按照以下方式进行查找:分别计算每个哈希值对应的比特位置存储的是否为
零,只要有一个为零,代表该元素一定不在哈希表中,否则可能在哈希表中。

三、代码

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #pragma once
  3. #include <iostream>
  4. #include <vector>
  5. template<size_t N>
  6. class BitSet
  7. {
  8. public:
  9. BitSet()
  10. {
  11. // 每个元素为char类型,占8个bit位
  12. _bitSet.resize((N >> 3) + 1, 0);
  13. }
  14. // 将位图某一位置1
  15. void Set(size_t x)
  16. {
  17. size_t i = x >> 3;
  18. size_t j = x % 8;
  19. _bitSet[i] |= (1 << j);
  20. }
  21. // 将位图某一位置0
  22. void Reset(size_t x)
  23. {
  24. size_t i = x >> 3;
  25. size_t j = x % 8;
  26. _bitSet[i] &= (~(1 << j));
  27. }
  28. // 检查位图中某一位是否为1
  29. bool Test(size_t x)
  30. {
  31. size_t i = x >> 3;
  32. size_t j = x % 8;
  33. return _bitSet[i] & (1 << j);
  34. }
  35. private:
  36. std::vector<char> _bitSet;
  37. };

四、测试

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include "BitSet.h"
  3. using namespace std;
  4. void TestBitSet()
  5. {
  6. // 开辟42亿9千万个bit位,512M空间;
  7. BitSet<-1> bs;
  8. // BitSet<0xffffffff> bs;
  9. bs.Set(9);
  10. bs.Set(19);
  11. bs.Set(29);
  12. bs.Set(39);
  13. cout << bs.Test(9) << endl;
  14. cout << bs.Test(19) << endl;
  15. cout << bs.Test(29) << endl;
  16. cout << bs.Test(39) << endl;
  17. cout << bs.Test(49) << endl;
  18. bs.Reset(19);
  19. bs.Reset(29);
  20. cout << endl;
  21. cout << bs.Test(9) << endl;
  22. cout << bs.Test(19) << endl;
  23. cout << bs.Test(29) << endl;
  24. cout << bs.Test(39) << endl;
  25. cout << bs.Test(49) << endl;
  26. }
  27. int main()
  28. {
  29. TestBitSet();
  30. return 0;
  31. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/odstu/article/detail/61297
推荐阅读
相关标签
  

闽ICP备14008679号