记一下常见的场景题,因为昨天面阿里的时候问了一道开放题,有点没有思路,所以将常见的场景题了解下不至于下次面试的时候手足无措吧
1.从10亿个数里面找出最大的100个数
首先用100个数去建立堆,建成最小堆,然后剩下的数分别和堆顶元素比较,如果比堆顶元素小,则直接抛弃,如果比堆顶元素大,那么就用这个元素替换掉堆顶元素,然后进行堆的调整,当所有元素都比较完成,则堆里面的100个数就是最大的100个数
优化方法:将10亿个元素分组存放,分成1000组,放到1000个文件中,然后在每个文件中建立一个堆,堆的数量是100个,然后统计每个文件里的前100个最大的数,最后,对这1000个堆再进行合并找出里面最大的100个数
2.100GB的文件中找出出现次数最多的100个ip
首先将所有ip的hashcode值对1000求模放在1000个文件中,然后再对每个文件中的ip进行hashmap来统计出现次数,按照出现次数放入个数为100的最小堆里,然后再对所有的最小堆进行合并选出最大的100个ip
3.海量数据,找出出现次数最多的数据
先将数据取出来放入n个文件中,然后在每个文件中找到最大的那个数据,然后找出n个文件里出现次数最多的那个数据
给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL?
使用布隆过滤器,先将其中一个文件的所有url用布隆过滤器进行映射处理,然后挨个读取另一个文件的url,进行检查,如果布隆过滤器中有的话,就是同一个url