it编程 > 编程语言 > C/C++

C++中BitSet和Bloom_Filter的实现

76人参与 2025-02-28 C/C++

前言:

在计算机图形学中,位图(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 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

深入理解Qt 初始项目代码

02-28

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

02-28

多线程-lock与lockInterruptibly的区别及说明

02-27

Qt Creator + CMake 构建教程的方法步骤

02-27

C++中pair使用的示例代码

02-26

Qt 中集成mqtt协议的使用方法

02-24

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论