C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++ BitSet和Bloom_Filter

C++中BitSet和Bloom_Filter的实现

作者:hian-ocean

本文主要介绍了C++中BitSet和Bloom_Filter的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言:

在计算机图形学中,位图(Bitmap)也称为光栅图,是由像素点组成的图像表示方式。在 C++ 编程中,位图可以通过特定的函数和数据结构来进行处理和操作。

BitMap

在这里插入图片描述

BitMap常见操作

BitMap实现

template<size_t N >
class bitset
{
public:

	birset()
	{
		_a.resize(N / 32 + 1);
	}

	void set(const size_t x)
	{
		size_t i = x / 32;
		size_t j = x % 32;

		_a[i]|= (i<<j)
	}
	void reset(const size_t x)
	{
		size_t i = x / 32;
		size_t j = x % 32;

		_a[i] &= (~(i << 32));
	}

	bool test(const size_t x)
	{
		size_t i = x / 32;
		size_t j = x % 32;

		return  _a[i] & (1 << j);
	}
private:
	vector<int> _a;
};

BitMap应用

一、图形图像领域

二、数据处理领域

三、其他领域

布隆过滤器

布隆过滤器(Bloom Filter)作为一种高效的数据结构,在大规模数据处理中有着广泛的应用。尤其是在 C++ 语言环境下,其性能表现备受关注。然而,要确定 C++ 布隆过滤器在大规模数据处理中的性能极限并非易事,需要综合考虑多个因素。

在这里插入图片描述

位图和布隆过滤器区别

布隆过滤器的实现

在C++中实现布隆过滤器,通常涉及以下步骤:

struct BKDRHash
{
	size_t operator()(const string& s)
	{
		// BKDR
		size_t value = 0;
		for (auto ch : s)
		{
			value *= 31;
			value += ch;
		}
		return value;
	}
};
struct APHash
{
	size_t operator()(const string& s)
	{
		size_t hash = 0;
		for (long i = 0; i < s.size(); i++)
		{
			if ((i & 1) == 0)
			{
				hash ^= ((hash << 7) ^ s[i] ^ (hash >> 3));
			}
			else
			{
				hash ^= (~((hash << 11) ^ s[i] ^ (hash >> 5)));
			}
		}
		return hash;
	}
};
struct DJBHash {
	size_t operator()(const string& s)
	{
		size_t hash = 5381;
		for (auto ch : s)
		{
			hash += (hash << 5) + ch;
		}
		return hash;
	}
};
class BloomFilter
{
public:
	void Set(const K& key)
	{
		size_t len = X * N;
		size_t index1 = HashFunc1()(key) % len;
		size_t index2 = HashFunc2()(key) % len;
		size_t index3 = HashFunc3()(key) % len;
		_bs.set(index1);
		_bs.set(index2);
		_bs.set(index3);
	}
	bool Test(const K& key)
	{
		size_t len = X * N;
		size_t index1 = HashFunc1()(key) % len;
		if (_bs.test(index1) == false)
			return false;
		size_t index2 = HashFunc2()(key) % len;
		if (_bs.test(index2) == false)
			return false;
		size_t index3 = HashFunc3()(key) % len;
		if (_bs.test(index3) == false)
			return false;
		return true;  // 存在误判的
	}
	// 不支持删除,删除可能会影响其他值。
	void Reset(const K& key);
private:
	bitset<X * N> _bs;
};

为什么布隆过滤器不支持元素的删除操作?

Bitmap Bloom Filter区别

一、数据结构和存储方式

二、功能和用途

三、性能特点

四、适用场景

2. 当需要快速判断元素可能存在性且可以接受一定误判率时:
适用数据结构:布隆过滤器。
3. 原因:布隆过滤器可以在非常低的空间开销下快速判断元素是否可能属于一个集合。虽然存在误判率,但在很多应用场景中,误判的影响可以通过其他方式进行处理或可以被接受。例如,在网页缓存中,即使偶尔误判一个 URL 已经被缓存过,也只是多进行了一次不必要的查询,不会对系统性能产生严重影响。

到此这篇关于C++中BitSet和Bloom_Filter的实现的文章就介绍到这了,更多相关C++ BitSet和Bloom_Filter 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文