76人参与 • 2025-02-28 • C/C++
在计算机图形学中,位图(bitmap)也称为光栅图,是由像素点组成的图像表示方式。在 c++ 编程中,位图可以通过特定的函数和数据结构来进行处理和操作。
bitmap
)是一种数据结构,它使用每一位二进制数来表示一个数据项的存在状态。set
和reset
就是进行位图的核心操作。test
的检测有很多方法,提供一个比较容易理解的检测。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; };
一、图形图像领域
二、数据处理领域
三、其他领域
布隆过滤器(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; } };
底层利用bitset不需要进行构造函数的实现
过滤器通过映射3个位置减少哈希冲突。
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
区别
空间复杂度:
时间复杂度:
位图:对于插入和查询操作,时间复杂度通常为 o (1),非常高效。因为只需要通过简单的位运算就可以完成操作。
布隆过滤器:插入和查询操作的时间复杂度也非常低,接近 o (1)。但是,由于需要进行多次哈希函数计算,实际时间开销可能会略高于位图。
误判率:
位图:如果正确实现和使用,位图不会产生误判。只要某个比特位被设置为 1,就表示对应的元素存在;如果为 0,则表示不存在。’
'布隆过滤器:存在一定的误判率,即可能会把不在集合中的元素误判为在集合中。误判率与哈希函数的数量、二进制向量的大小以及元素数量有关。可以通过调整这些参数来降低误判率,但同时也会增加空间占用。
原因:位图可以准确地表示元素的存在与否,不会产生误判。如果数据没有重复,位图可以非常高效地利用存储空间,并且查询速度极快。
当需要快速判断元素可能存在性且可以接受一定误判率时:
适用数据结构:布隆过滤器。
原因:布隆过滤器可以在非常低的空间开销下快速判断元素是否可能属于一个集合。虽然存在误判率,但在很多应用场景中,误判的影响可以通过其他方式进行处理或可以被接受。例如,在网页缓存中,即使偶尔误判一个 url 已经被缓存过,也只是多进行了一次不必要的查询,不会对系统性能产生严重影响。
2. 当需要快速判断元素可能存在性且可以接受一定误判率时:
适用数据结构:布隆过滤器。
3. 原因:布隆过滤器可以在非常低的空间开销下快速判断元素是否可能属于一个集合。虽然存在误判率,但在很多应用场景中,误判的影响可以通过其他方式进行处理或可以被接受。例如,在网页缓存中,即使偶尔误判一个 url 已经被缓存过,也只是多进行了一次不必要的查询,不会对系统性能产生严重影响。
到此这篇关于c++中bitset和bloom_filter的实现的文章就介绍到这了,更多相关c++ bitset和bloom_filter 内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论