设计算法
给你a、b两个文件,各存放50亿条url,每条url各占用64字节,内存限制是4G,找出a、b文件共同的url
思路
一个文件中能有50亿条的记录也是够可以的。这题整体上不难,只要学过数据结构的基本上都能明白考点在哪里。
首先内存不够,肯定是将这两个大文件分别有序的粉碎成若干个不同的小文件。
每个文件的大小必须小于2G (两个文件比较,所以单个文件不能超过2G)
然后排序找出相同的url写入另外一个文件中
实现
1.计算出应该分成多少个文件。如果文件分的过多也影响效率的,所以每个文件的大小不能过小,也不能超过2G。
这里举例每个文件的大小为 1000*1000*1000*2 ~ 2G = 2000000000 字节
50亿 = 5000000000 * 64 = 320000000000 字节
320000000000 / 2000000000 = 160
所以分成160个文件 实际当中应该经过反复的测试调整文件个数
2.使用 hash(url)%160 处理a、b两个文件,分别放入160个不同的文件中(a_0,a_1,...a_159)(b_0,b_1,...b_159)
1个文件中有 320000000000 / 160 / 64 = 31250000 个url
3.分别对所有文件先进行排序,再去除每个文件中相同的url (相同相近)
4.一一对应的方式提取(a_0, b_0) 提取两个文件中的url放入内存中,先排序再获取相同的url
5.将相同的url写入到另外一个文件中