目录

1.位图

位图的简单实现

位图相关练习题

2.布隆过滤器

3.哈希切分


1.位图

位图的简单实现

#pragma once
namespace bit
{template<size_t N>class BitSet{public:BitSet(){_bits.resize(N / 32 + 1, 0);}// 把x映射的位标记成1void Set(size_t x){assert(x < N);// 算出x映射的位在第i个整数// 算出x映射的位在这个整数的第j个位size_t i = x / 32;size_t j = x % 32;// _bits[i] 的第j位标记成1,并且不影响他的其他位_bits[i] |= (1 << j);}void Reset(size_t x){assert(x < N);size_t i = x / 32;size_t j = x % 32;// _bits[i] 的第j位标记成0,并且不影响他的其他位_bits[i] &= (~(1 << j));}bool Test(size_t x){assert(x < N);size_t i = x / 32;size_t j = x % 32;// 如果第j位是1,结果是非0,非0就是真// 如果第j为是0,结果是0,0就是假return _bits[i] & (1 << j);}private:vector<int> _bits;};void TestBitSet(){//BitSet<4294967295u> bs;BitSet<-1> bs;}
}

位图相关练习题

2.布隆过滤器

#pragma once
#include "BitSet.h"//三种字符串哈希算法
struct HashBKDR
{// "int"  "insert" // 字符串转成对应一个整形值,因为整形才能取模算映射位置// 期望->字符串不同,转出的整形值尽量不同// "abcd" "bcad"// "abbb" "abca"size_t operator()(const std::string& s){// BKDR Hashsize_t value = 0;for (auto ch : s){value += ch;value *= 131;}return value;}
};struct HashAP
{// "int"  "insert" // 字符串转成对应一个整形值,因为整形才能取模算映射位置// 期望->字符串不同,转出的整形值尽量不同// "abcd" "bcad"// "abbb" "abca"size_t operator()(const std::string& s){// AP Hashregister size_t hash = 0;size_t ch;for (long i = 0; i < s.size(); i++){ch = s[i];if ((i & 1) == 0){hash ^= ((hash << 7) ^ ch ^ (hash >> 3));}else{hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));}}return hash;}
};struct HashDJB
{// "int"  "insert" // 字符串转成对应一个整形值,因为整形才能取模算映射位置// 期望->字符串不同,转出的整形值尽量不同// "abcd" "bcad"// "abbb" "abca"size_t operator()(const std::string& s){// BKDR Hashregister size_t hash = 5381;for (auto ch : s){hash += (hash << 5) + ch;}return hash;}
};template<size_t N, class K = std::string,class Hash1 = HashBKDR,class Hash2 = HashAP,class Hash3 = HashDJB>class BloomFilter
{
public:void Set(const K& key){//Hash1 hf1;//size_t i1 = hf1(key);size_t i1 = Hash1()(key) % N;size_t i2 = Hash2()(key) % N;size_t i3 = Hash3()(key) % N;cout << i1 << " " << i2 << " " << i3 << endl;_bitset.Set(i1);_bitset.Set(i2);_bitset.Set(i3);}bool Test(const K& key){//分别判断三个映射位size_t i1 = Hash1()(key) % N;if (_bitset.Test(i1) == false){return false;}size_t i2 = Hash2()(key) % N;if (_bitset.Test(i2) == false){return false;}size_t i3 = Hash3()(key) % N;if (_bitset.Test(i3) == false){return false;}// 这里3个位都在,有可能是其他key占了,在是不准确的,存在误判// 不在是准确的return true;}private:bit::BitSet<N> _bitset;bit::vector<char> _bitset;};void TestBloomFilter()
{//简单测试/*BloomFilter<100> bf;bf.Set("张三");bf.Set("李四");bf.Set("牛魔王");bf.Set("红孩儿");cout << bf.Test("张三") << endl;cout << bf.Test("李四") << endl;cout << bf.Test("牛魔王") << endl;cout << bf.Test("红孩儿") << endl;cout << bf.Test("孙悟空") << endl;*/BloomFilter<600> bf;size_t N = 100;std::vector<std::string> v1;for (size_t i = 0; i < N; ++i){std::string url = "https://mp.csdn.net/mp_blog/creation/editor/126629245";url += std::to_string(1234 + i);v1.push_back(url);}for (auto& str : v1){bf.Set(str);}for (auto& str : v1){cout << bf.Test(str) << endl;}cout << endl << endl;std::vector<std::string> v2;for (size_t i = 0; i < N; ++i){std::string url = "https://blog.csdn.net/weixin_48953972/article/details/125643506";url += std::to_string(6789 + i);v2.push_back(url);}size_t n2 = 0;for (auto& str : v2){if (bf.Test(str)){++n2;}}cout << "相似字符串误判率:" << (double)n2 / (double)N << endl;std::vector<std::string> v3;for (size_t i = 0; i < N; ++i){std::string url = "https://zhuanlan.zhihu.com/p/43263751";url += std::to_string(6789 + i);v3.push_back(url);}size_t n3 = 0;for (auto& str : v3){if (bf.Test(str)){++n3;}}cout << "不相似字符串误判率:" << (double)n3 / (double)N << endl;}

3.哈希切分

C++ 哈希的应用(补充)相关推荐

  1. Swift中的一致性哈希算法(补充)

    2019独角兽企业重金招聘Python工程师标准>>> 总结一下,理解算法时的几个问题,搞懂这些基本上就算理解Swift rebalnce的算法了. Swift如何保证文件的随机存储 ...

  2. STL中的空间配置器

    STL中的空间配置器 文章目录 STL中的空间配置器 1. 什么是空间配置器 2. 为什么需要空间配置器 3. SGI-STL空间配置器实现原理 3.1 一级空间配置器 3.2 二级空间配置器 3.1 ...

  3. Object.hashCode()与Object.equals()

    [README] 本文旨在po出 hashCode , equals的api描述,以加深理解: 本文翻译自 jdk 文档: [1]Object.hashCode() 1)介绍:返回对象的哈希码值.支持 ...

  4. 初创企业融资应量力而行

    在启动雄心勃勃的科技初创公司时,齐尼奥斯•斯拉希伍卢(Xenios Thrasyvoulou)遵守了硅谷的规则.在其自由职业者求职招聘网站PeoplePerHour上线仅仅一年后,这位在伦敦生活的创始 ...

  5. Java遍历HashSet为什么输出是有序的?

    HashSet 是否无序 (一) 问题起因: <Core Java Volume I-Fundamentals>中对HashSet的描述是这样的: HashSet:一种没有重复元素的无序集 ...

  6. 安全规约ZSS ZSS+ ZSS# Scheme

    搜索索引:ZSS协议,ZSS方案,安全规约ZSS,ZSS+协议 一.前言 二.可计算的简单问题 三.ZSS Scheme 四.ZSS+ Scheme 五.ZSS# Scheme 一.前言 在上安全规约 ...

  7. 【0725】诺瓦科技java开发笔试题

    一共14道1个小时,其中三道是比较简单的编程题,其余有几道java基础.通信协议.操作系统等. 1.HTTP与HTTPS的区别 参考: https://blog.csdn.net/xiaoming10 ...

  8. 34、【华为HCIE-Storage】--数据重删 数据压缩

    ------------------------------------重要说明------------------------------------ 以下部分内容来网络,部分自华为存储官方教材 具 ...

  9. JDK7-hashmap源码

    解决冲突的方法 提高效率 特殊情况扰动算法 当冲突大于一定量时需要扩容 在JDK1.7中,HashMap是由数组+单向链表实现的,原理图如下: HashMap基本用法 public static vo ...

最新文章

  1. spring上下文是什么意思_Java程序员只会CRUD连Spring事务传播机制都不懂?
  2. NHibernate和Cuyahoga(二)(翻译):
  3. u3d中texture2D的Advanced设置解析
  4. ad file type not recognised_Java实用工具类:File工具类方法学习,可创建目录及文件...
  5. 90%代码如何实现自动迁移到鲲鹏平台?
  6. spring加载classpath与classpath*的区别别
  7. C++求100以内中的所有素数
  8. 超级记事本android,基于Android的超级记事本APP设计.doc
  9. AC97声卡的驱动安装
  10. 如何学习数字集成电路:数字IC必读书籍
  11. pm2部署next项目
  12. K650D安装黑苹果
  13. 淘宝省钱攻略–人人可以做到
  14. Convex functions
  15. 浏览器网页 自动转格式化显示json数据
  16. md文件打开方式推荐
  17. 【数据库系统】数据库系统概论====第十三章 数据库技术发展
  18. UDP Socket接收缓冲区与netstat Recv-Q
  19. 坏小子军团Stary造了一块电动滑板,想帮你用最低的代价去耍(zhuang)酷(bi)
  20. 《Adobe Photoshop CC经典教程》—第1课1.4节在Photoshop中还原操作

热门文章

  1. 将.C文件编译成最小的PE可执行文件
  2. 高新技术企业的申报流程是怎样的?
  3. 鲍尔默给微软带来了什么
  4. 2010年中国十大SNS网站排名(转)
  5. 电脑拓展显示器软件显示不清晰问题
  6. 盘点科技公司十大裁员风波:诺基亚累计裁员近半(转)
  7. PAT A1153 Decode Registration Card of PAT ——凭谁问,廉颇老矣,尚能饭否
  8. 爬虫入门教程⑧— BeautifulSoup解析豆瓣即将上映的电影信息
  9. python数字组合_将数字组合在一起形成多个数字的编号
  10. 详解DNS工作流程及原理 ( 域名、IP与DNS的关系)