| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> [C++数据结构](23)哈希:位图,布隆过滤器,哈希切割 -> 正文阅读 |
|
[数据结构与算法][C++数据结构](23)哈希:位图,布隆过滤器,哈希切割 |
哈希特殊应用位图(BitMap)题目: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断这个数是否在这40亿个数中。 思路: 把这40亿个数放进 unordered_set 里?显然不现实,因为光是40亿个整型就需要约15GB空间,更别提哈希表的其他资源消耗,内存空间不够。 注意到我们需要找的是一个数存不存在,记录一个数是否存在只需要一个bit位,这样的话,一个bit位一个地址,采用直接定址法只需要开 2 32 2^{32} 232 (整型能表示的数据个数) 个bit,也就是 512MB 空间 代码实现: 注意一些位运算的技巧
其实库里面提供了位图容器 详情参考文档:bitset - C++ Reference (cplusplus.com) 位图应用
重写一个位图,让两个bit表示一个状态,一共三种状态:出现0次、出现1次、出现多次。 这样这个位图需要开的空间是原来位图的2倍,也就是1GB 代码实现: 使用两个bitset实现,就不需要重写映射关系了
位图优点: 节省空间,快 位图缺点: 只能针对整型。 布隆过滤器位图只能针对整型,因为整型可以使用直接定址法,且不存在哈希冲突。如果将字符串转换成整型则可能出现哈希冲突,而位图中没有真正存入这个字符串,无法进行比对,所以不能解决哈希冲突的问题。 布隆过滤器则是对位图的一种改造,可以让一个 key 映射多个地址(使用多个哈希函数),降低哈希冲突的概率。不过它依然有一定的误判概率。在查找的时候,它只能告诉你这个值一定不在或可能在。 具体映射多少个地址,要看具体情况,映射的越多,哈希冲突的概率越小,但是占用的空间就越大。 如何选择合适的哈希函数个数呢,这里直接给出公式: 实现 三个哈希函数的版本:
布隆过滤器支持删除吗,如何删除?
布隆过滤器应用场景:
哈希切割问题:给一个超过100G的log文件,log中存着IP地址,如何找出出现次数最多的IP地址。 这是个 kv 模型,不可使用位图和布隆过滤器。 解决方案:创建100个文件,然后依次读取ip,算出 缺陷:
解决方案:
应用:给两个文件,分别有100亿个ip,我们只有1G内存,如何找两个文件的交集 解决:创建A0 A1 ··· A999,B0 B1 ··· B999,共2000个小文件,分别计算两个文件中的 i = HashFunc(ip) % 1000,分别放到Ai,Bi中,最后对每一对小文件求交集。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:15:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |