这些问题一般有着内存限制,使用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的就是要找的,如果在内存上有限制的话,就要分区间处理。找中位数也如果,分区间处理,通过累加每个区间的出现的次数,找到中位数落在那个区间,再对这个区间做词频统计。