网站推广业务展会布置
news/
2025/9/23 17:13:50/
文章来源:
网站推广业务,展会布置,网络设计专业介绍,注册个人网站要钱吗一、位图
1.1 概念 所谓位图#xff0c;就是用每一位来存放某种状态#xff0c;适用于海量数据#xff0c;数据无重复的场景。通常是用来判断某个数据存不存在的。 数据是否在给定的整形数据中#xff0c;结果是在或者不在#xff0c;刚好是两种状态#xff0c;那么可以…一、位图
1.1 概念 所谓位图就是用每一位来存放某种状态适用于海量数据数据无重复的场景。通常是用来判断某个数据存不存在的。 数据是否在给定的整形数据中结果是在或者不在刚好是两种状态那么可以使用一个二进制比特位来代表数据是否存在的信息如果二进制比特位为1代表存在为0代表不存在。比如 1.2 实现
namespace bitmap
{// N是需要多少比特位templatesize_t Nclass bitset{public:bitset(){_bits.resize((N 5) 1, 0);}void set(size_t x){size_t i x / 32;size_t j x % 32;_bits[i] | (1 j);}void reset(size_t x){size_t i x / 32;size_t j x % 32;_bits[i] ~(1 j);}bool test(size_t x){size_t i x / 32;size_t j x % 32;return _bits[i] (1 j);}private:vectorint _bits;};templatesize_t Nclass twobitset{public:void set(size_t x){if (_bs1.test(x) false _bs2.test(x) false){_bs2.set(x);}else if (_bs1.test(x) false _bs2.test(x) true){_bs1.set(x);_bs2.reset(x);}else if (_bs1.test(x) true _bs2.test(x) false){_bs1.set(x);_bs2.set(x);}}void Print(){for (size_t i 0; i N; i){if (_bs1.test(i) false _bs2.test(i) true){cout 1- i endl;}else if (_bs1.test(i) true _bs2.test(i) false){cout 2- i endl;}}cout endl;}private:bitsetN _bs1;bitsetN _bs2;};
}
1.3 应用
快速查找某个数据是否在一个集合中排序去重求两个集合的交集、并集等操作系统中磁盘块标记
二、布隆过滤器
2.1 引出
用哈希表存储用户记录缺点浪费空间用位图存储用户记录缺点位图一般只能处理整形如果内容编号是字符串就无法处理将哈希与位图结合即布隆过滤器
2.2 概念 布隆过滤器是由布隆在1970年提出的一种紧凑型的、比较巧妙的概率型数据结构特点是高效的插入和查询可以用来告诉你某样东西一定不存在或者可能存在它是用多个哈希函数将一个数据映射到位图结构中。此种方法不仅可以提升查询效率也可以节省大量的内存空间。 2.3 实现
namespace bloomfilter
{struct BKDRHash{size_t operator()(const string s){// BKDRsize_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;}};templatesize_t N,size_t X 5,class K string,class HashFunc1 BKDRHash,class HashFunc2 APHash,class HashFunc3 DJBHashclass 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;/* cout index1 endl;cout index2 endl;cout index3 endlendl;*/_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:bitsetX* N _bs;};
}2.4 查找 布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中因此被映射到的位置的比特位一定为1。所以可以按照以下方式进行查找分别计算每个哈希值对应的比特位置存储的是否为零只要有一个为零代表该元素一定不在哈希表中否则可能在哈希表中。 注意布隆过滤器如果说某个元素不存在时该元素一定不存在如果该元素存在时该元素可能存在因为有些哈希函数存在一定的误判。
2.5 删除
布隆过滤器不能直接支持删除工作因为在删除一个元素时可能会影响其他元素。
【缺陷】
无法确定元素真正在布隆过滤器中存在计数回绕
2.6 优缺点
【优点】
增加和查询元素的时间复杂度为O(K)K为哈希函数的个数一般比较小与数据量发小无关哈希函数相互之间没有关系方便硬件并行运算布隆过滤器不需要存储元素本身在某些对保密要求比较严格的场合有很大优势在能承受一定的误判是布隆过滤器比其他数据结构有着很大的空间优势数据量很大时布隆过滤器可以表示全集其他数据结构不能使用同一组散列函数的布隆过滤器可以进行交、并、差运算
【缺陷】
有误判率即存在假阳性即不能准确判断元素是否在集合中补救方法再建立一个白名单存储可能误判的数据不能获取元素本身一般情况下不能从布隆过滤器中删除元素如果采用计数方式删除可能会存在技术回绕问题
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/913277.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!