1.给定一个大小超过100G的文件,其中存在IP地址,找到其中出现次数最多的地址。
我们要对文件进行哈希切分:也就是利用哈希函数的思想,对文件中的IP做%1000计算 ,
将余数为0~999的结果(以键值对的方式)分别输出到0~999号文件中。(每个文件的平均大小大约是100M左右)
找出每个文件中出现次数最多的IP,再次进行比较得到最大的IP值。
注:操作系统可以依次读取硬盘中的100G文件。
2.给定100亿个整数,找出只出现一次的整数。
我们用位图变形的方式来解决这个问题。用两个比特位来表示一个整数,第一个比特位表示该比特位是该整数否出现了多次,第二个比特位表示是该整数否出现了一次。
即:11表示出现了多次, 01表示出现了一次 ,00表示一次都未出现 。
整数的大小为2^32, 我们用两个比特位来表示,则一共需要2^33个比特位,也就是1G的内存。
我们建立1G内存的位图,将100亿个整数逐个插入到位图中,然后遍历位图
(建立count=0计数器,每次检查移动两位、并且count++,检查值是否为01,如果为01就输出count到指定文件中。 )
即得到所有只出现一次整数的集合。
3.有两个文件分别有100亿个字符串,只有1G内存,找到两个文件的交集。
我们要利用 哈希文件切分 和 布隆过滤器的思想。
对第一个文件中的每个字符串进行 哈希函数 (2个或者多个)计算,将两个计算结果相加后%100的余数为0~99的结果输出到0~99 个文件中。
对第二个文件也进行相应的操作。
对这100个小文件进行,去掉只出现一次的数据,然后数据去重就得到了交集(数据库有相关的函数调用),然后再将处理后的结果合并为一个文件。
4.给上千个文件,每个文件的大小为1k~100M,设计算法找出某个词在哪些文件中。
我们采用倒排索引的方式。
逐个遍历这1000个文件,对每个文件中出现的所有词语进行制表,即将单词进行哈希计算,建立哈希桶。(假设内存足够)
同一个文件中相同的单词只记录一次。 这样在遍历完成所有的文件后,我们就可以对一个新的单词进行哈希计算,然后再哈希桶中查找它在哪些文件中出现过。