这些问题通常有着内存限制,使用hashmap和位图解决不实际。数组
1.只用2GB内存在20亿个整数中找到出现次数最多的数?
将20亿个整数的大文件用hash函数分为16小文件(这个时候同一个数通常分到了同一个小文件上,小文件的数最好不要超过2亿),这个时候每一个小文件用hash函数计算出现次数,这个时候获得16个数为各自文件下出现最多,再比较获得这16个数出现最多的那个,就是咱们想要的。函数
2.40亿个非负整数中找到没出现的数?
32位无符号整数的范围是0-4294967295,存在于一个文件上,最多使用一个G的内存(全部不出现的数),或者说限制为10m的内存(一个未出现的数)。
比如将他们分了64个区间,一个区间应该有67108864,将这个些数遍历,先申请一个长度64的整数数组,统计在区间i 上的个数,遍历完以后,再遍历区间数组,少于67108864的拿出来找缺失的j,接着作67108864的位图数组,再遍历一遍0-4294967295,不在区间j的忽略,没有置1的天然就是缺失了,这时要找的是67108864*i+j。排序
3.找到100亿个URL中重复的URL以及搜索词汇的topK问题?
这个都是创建在数据量很大的状况下,通常作法划分小文件或多个机器上,就是经过哈希函数来划分,能保证相同的数据放到相同的机器或文件上,而后在小文件或机器上使用哈希函数统计,小根堆排序top100,而后把不一样机器的top100进行外排序或继续使用小根堆。内存
4.40亿个非负整数中找到出现次数两次的数和全部数的中位数?
若是有1G的内存,就开个大位图数组长度为80亿,第一遇到num就见bitArr[num*2+1]和bitArr[num*2]设置01,下一次10,第三次或屡次都是11,这个遍历bitArr时10的就是要找的,若是在内存上有限制的话,就要分区间处理。找中位数也若是,分区间处理,经过累加每一个区间的出现的次数,找到中位数落在那个区间,再对这个区间作词频统计。hash