哈希如何处理海量数据问题

搜索(查找)使用的数据结构
平衡二叉树
内存中使用的——二叉平衡树

  1. AVL树
  2. 红黑树

哈希表:

  1. 目的(查询)
  2. 基本原理:1.哈希 2.冲突 3.数据(随机访问O(1) )

对比 哈希 vs 加密 vs 压缩

  • 哈希:任意数据=>比之前小的数据 . hash(data)=哈希值<<data
    单向:原始数据=>哈希值 哈希值不能返回到原始数据。
    MD5,SHA-256(用来校验正确性1.保存密码2.TCP的校验和 )
  • 加密:不保证加密过的数据<原始数据 加密独有的特征:有密钥(你自己独有的一串数据)
    双向:原始数据=>密文 密文=>原始数据 算法是公开的,秘钥是私有的 (可保证安全性)
    对称加密:在加密和解密的过程中使用的同一把秘钥(使用敏感信息)DES,3DES,AES
    非对称加密:先生成一对秘钥privateKey,publicKey,A要给B发送信息,首先会给B publicKey,然后A对发送信息使用privateKey加密,发送给B,B使用publicKey解密,公钥和私钥是需要配合使用的。
    RSA,ECC,DSA
  • 压缩:满足一定特征的数据=>比之前数据小的数据 compress(data)=压缩后的数据<<data
    双向:原始数据=>压缩数据 压缩数据=>原始数据 (算法公开,任意拿到数据的人可以压缩,解压)
    zip/rar/gzip 普通
    jpg/png 图片
    哈夫曼树
    h264 视频
    (有损压缩,无损压缩)

海量数据处理(哈希有关)

  1. 一组无符号整数中,如何判断一个数在还是不在?
    回答是:利用Set< Long >set=…;
    第一步:把所有的数据都放在set 中;
    第二步:判断在与不在 set.contains(n);
  2. 40亿个无符号的整数中,如何判断一个数是在还是不在?
    回答是,无法使用第一问的方式解决,因为40亿*32位=内存占用量太大了,内存里面放不下
  3. 位图的出现:
    1 .类似使用hash表,但是不能有哈希冲突。——无符号整数满足这个条件 0=>0 ,1=>1 是一一对应的
    2 .利用1bit来保存一份信息,所以只能保存二元信息: 1/0 ,true/false, yes/no, 存在/不存在
    在这里插入图片描述
    如果查找3在不在? 如果3号小标对应的bit为1则代表在,如果是0代表是不在。

布隆过滤器——弥补位图的一部分缺点:
位图的缺点是:只能保存无符号的字符,因为要求不能出现hash冲突
海量数据时:背后使用了位图,解决的是通用数据的 在还是不在的问题?
布隆过滤器的提出:
我们在使用新闻客户端看新闻时,他会给我们不停推送新的内容,它每次推荐是需要去重,去掉呢些一进看过的内容问题来了,问题来了,新闻科客户端如何实现推送的去重呢?用服务器记录用户看多的历史记录,当及推荐系统推荐新闻的时候会从每个用户的历史记录里进行筛选,过滤掉呢些已经存在的记录,如何快速查找呢些已经看多的视频呢?

1.用哈希表存储用户的记录,缺点是太浪费空间。
2.用位图存储用户的记录,无法解决哈希冲突。
3.将哈希表和位图相结合。
在这里插入图片描述
布隆过滤器(轻量级)配合 完整行为分析(记录你每一个行为,重量级)
在这里插入图片描述

海量数据处理的面试题:(特征是数据量大到按通常的方案,一台机器的内存中是放不下的)

  1. 哈希切割:
    给一个超过100G(此100G其实就是代表内存放不下的)大小的log file,log中存着ip地址,设计算法找到出现次数最多的IP地址?
    与上题条件一样,如何找到top K的IP?
    如果没有海量数据的限制下,这个问题如何求解?
    一组数据中,找到某个数据的出现次数。
    思路:扫描所有的数据,得到Map<数据,出现次数>,
    然后得到反向Map<出现次数,数据>,排序出现次数,再根据次数找到数据。

那如果加上海量数据此问题如何解决?
海量数据会导致内存中无法一次读取处理 ---->我们可以分为多次处理----->分文件处理
那分文件可以平均分割吗? 提前保证分出的大小是够一次内存处理
在这里插入图片描述
呢我们该如何解决这个问题呢?
对数据进行排序?
如果使用排序的话,成本会非常的大——归并排序O(n*log(n) ),保证相同ip出现在同一个相同文件(需要一定的成本)
我们可以通过哈希函数(ip)=>下标(被分到的文件的下标)
在这里插入图片描述
海量数据处理的万能套路:

分文件处理,需要按照哈希方式分文件
先分组,然后就可以避免之前的呢样情况,这样会将选择一样的分到一个阵营中,就不如看足球比赛,喜欢不同队你就加入不同队所在的区域,穿着同样的衣服,就算如果裁判的话可以一眼看过去看到哪一队的粉丝最多。

第二个问题如何找到出现最多次top K的IP?
不考虑海量数据的限制:使用小堆解决。(华山论剑,先看K是多少就占多少坑,然后不断的使用数据和对的root节点比大小,数据比完也就是找到了topK)

现在加上海量数据:
我们找出现次数最多的3个ip

计算每一个分组的文件的TOP3问题:
在这里插入图片描述

  1. 遍历文件中的每一个ip,统计每个ip的出现次数Map< ip,出现次数 >
  2. 逆置Map=>Map<出现次数,ip>
    在这里插入图片描述
  3. 建一个小堆(大小为3),找出TOP3
  4. 最后从选出的代表中找出全局的TOP3

位图的应用

1.给定100亿个整数,设计算法找到只出现一次的整数?
海量数据的第二个思路:做数据的信息压缩(位图+布隆过滤器)
就是把数据小化,不是万能套路,有限情况下如果可以使用,速度一般会比分文件快。

2.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章