| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 十亿数据如何去重,红黑树到hash再到布隆过滤器 -> 正文阅读 |
|
[大数据]十亿数据如何去重,红黑树到hash再到布隆过滤器 |
学习本文章的小提示:如果你已经有了一定基础,可以直接看文章的黑体总结部分。
对于前四个问题,这些大量的数据我们应该如何进行存储判断
如果数据量比较少,我们可以直接挨个与数据库存储的信息进行对比得到答案,但如果数据量十分庞大,甚至达到上亿的级别,我们还能直接与数据库的信息进行对比吗? 想要明白上一点,我们先来聊聊关于缓存穿透的问题,它是如何发生的,以及我们该如何解决它。 需求: 学过C++的朋友都知道set和map,但你清除它们的内部是如何实现的吗? 对于严格平衡?叉搜索树(AVL),100w条数据组成的红?树,只需要?较20次就能找到该值;对于10亿条数据只需要?较30次就能找到该数据;也就是查找次数跟树的?度是?致的; 在红?树中每?个节点都存储key和val字段,key是?来做?较的字段;红?树并没有要求key字段唯?,在set和map实现过程中限制了key字段唯?。我们来看nginx的红?树实现:
另外set和map的关键区别是set不存储val字段; 过渡点:通过上边的内容我们已经知道了map内部是由红黑树实现的,时间复杂度相对较低了,但如果是一个字符单词,甚至是一个url(很长的字符串),如果数据量较大时,比如10亿条数据需要?较30次能找到该数据,但对于字符串的比较相对也是比较耗时的,有没有一种办法能避免或者减少比较呢,于是出现了hash结构(通过数组和hash函数来实现的一种数据结构)。map内部是红黑树实现的,unordered_map则采用了hashtable c++标准库(STL)中的unordered_map<string, bool>是采?hashtable实现的; hash函数的作?:避免插?的时候字符串的?较;hash函数计算出来的值通过对数组?度的取模
这两种都会导致同类hash聚集;也就是近似值它的hash值也近似,那么它的数组槽位也靠近,形成hash聚集;第?种同类聚集冲突在前,第?种只是将聚集冲突延后; 重点:何为同类hash聚集;也就是近似值它的hash值也近似,比如(nihao,nihaoa)这两个字符串由于很接近,所有通过一个hash函数得到值可能比较解决,就会出现hash聚集的情况,所以我们采用了双重哈希来解决这个问题。 双重哈希其实就是(双重散列分布算法)来保证相近的字符串通过hash函数得到的结果具有强随机分布性(防碰撞)从而避免hash聚集。具体原理请点击:双重哈希原理https://www.cnblogs.com/organic/p/6283476.html 细节总结到目前为止,我们已经明白了红黑树以及hash对于数据查找带来的各自的优势,但它们都有一个最大的共同缺点,就是无法解决十分庞大的数据问题。因为不管是红黑树还是hashtable,它们都需要存储具体字符串,如果是十亿的数据,显然提供不了几百G的内存给它存放;所以在不断的发掘一种不用存放key值,同时具有hash结构的优点的数据结构。于是出现了我们今天的主角布隆过滤器定义:布隆过滤器是?种概率型数据结构,它的特点是?效的插?和查询,能明确告知某个字符串?定不存在或者可能存在 原理:当?个元素加?位图时,通过k个hash函数将这个元素映射到位图的k个点,并把它们置为1;当检索时,再通过k个hash函数运算检测位图的k个点是否都为1;如果有不为1的点,那么认为不存在;如果全部为1,则可能存在(存在误差);
假定我们选取这四个值为:
在实际应?中,我们确定n和p,通过上?的计算算出m和k;也可以在?站上选取合适的值:计算m和k的网站(点我https://hur.st/bloomfilter) 布隆过滤器的细节点:1:这里的k个hash函数是什么意思,真的是k个不同的哈希函数吗?其实通过下边的代码我们就可以明白,实际上只有一个哈希函数,但上边讲hashtable的时候我们说过可以采用双重hash的结构来避免同类哈希聚集,所以下边的代码我们可以看出同样采用了双重hash的结构,同时使用一个循环来实现这些命中的点的不同位置(以防命中同一个点)2:还有一个细节点要明白:当?个元素加?位图时,通过k个hash函数将这个元素映射到位图的k个点,并把它们全置为1;当检索时,再通过k个hash函数运算检测位图的k个点是否都为1;如果有不为1的点,那么认为不存在;如果全部为1,则可能存在(存在误差); 这里一定要明白,加入过程和检索过程是不一样的,加入是全设为1,检索是判断是否全为1,如果不是全为1,说明从来没有加入过,所以一定不存在,而就算全是1,也不一定存在,因为确实有可能同一个数据通过多次哈希都映射到了相同的几个位图点上。// 采??个hash函数,给hash传不同的种?偏移值
// 通过这种?式来模拟 k 个hash函数 跟我们前?开放寻址法 双重hash是?样的思路 大总结:本文章学习了从红黑树到hashtable再到布隆过滤器的演变,阐述了它们各自的优缺点,那么我们也应该深入了解它们各自都使用于哪些场景下:对于普通类型的数据,可以采用红黑树来快速进行查找,而对于字符串类型的数据,如果采用红黑树进行查找,由于字符串的对比会花费较多的比较时间,所以我们采用了更好的方法hashtable(数组和hash函数配合),从而避免或者减少了字符串的比较,提高查找效率,再后来引申到对于海量数据的存储管理,这两种结构都不适合,因为要进行存储的数据量实在太大,所以出现了布隆过滤器这种不需要存储key值就能进行判断的结构。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/23 16:54:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |