1.哈希+分治
寻找共同的URL
给定两个a和b文件,各存放50亿个URL,每个URL占64字节,内存限制4GB,请找出a和b文件中共同的URL。
一个文件的内存:5 000 000 000 * 64 = 320GB,每个文件可以分为100个小文件,每个文件大约是3.2GB。
- 思路一:分治+哈希+hashset,先把a通过hash函数取余分成100个小文件,再把b文件也是相同的方法,然后依次将a0和b0通过hashset进行统计相同的url,直到a,b所有的对应文件统计完毕。
- 思路二:Bloomfilter过滤器,建立一个位数组,然后把a文件映射上去,在从b文件里面查重,会有误判。
1000万个字符串去重(假设每个字符串64字节)
10 000 000 * 64 = 0.64GB,数据不多可以考虑直接加载进内存,使用Trie树,hash表,红黑树这些都可以去重。
ps:Trie树,利用了字符串的最大前缀信息的一种树结构,非常适合短文本,重复大的字符串查询场景。
2.文件的排序
五亿整数的大文件进行排序;
- 外排序,一般是在内存空间不足的情况下进行的,使用多路归并的思路,就是先把文件分成小文件使用内存排序,然后在将这些有序的小文件进行多路归并排序。
- 用最小堆,每次删除堆顶元素,并找到该元素的对应文件加入一个元素,不断的循环读取元素即可;
给n个整数排序,没有重复,值都小于等于一千万,内存使用1MB。
- 思路一:使用位图法,申请一千万个比特数组,空间占用为1.2MB,所以可以分割为两块,比如1-五百万和其他部分,在进行合并成一个。效率比较高因为IO操作少。
3.倒排索引
通过词来索引到文档的id号称为倒排索引,找到对应文档的id号。
ps:一般应用于文档检索系统,搜索引擎这种。
4.一致性hash原理
背景:原本分布式集群进行请求分配时是对服务器数量进行取模的,但是这样对增加和删除机器非常不友好,所以就想着在请求和服务器之间加一个中间件来解决这个问题。
申请一个很大的数组比如1到2的32次方,然后把用户请求均匀的利用hash函数散列到数组上,再把服务器散列到数组上,每次用户请求时,会寻找离他最近的一台机器,来实现负载均衡。
解决机器分布不平衡:一个机器上创建多个副本节点,放置服务节点--虚拟节点。