解决这类题目的思路一般为
(1)能否用特殊的数据结构解决:位图,布隆,堆。
(2)哈希切分
1。给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址
思路分析:
1.要进行哈希切分编号,log file可以看做是字符串,利用哈希字符串转换算法进行转换,转换成整型后,利用哈希函数进行映射,同一IP地址肯定映射到同一编号中,
2.这里我们使用效率很快的哈希表,进行此数的统计,就可以找出出现此数最多的IP地址
2.与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现?
思路分析:
要找到topK的IP地址,如果直接进行排序的话,内存放不下,而且效率太慢,所以这我们可以建一个K大小的堆,这里建小堆比较好,因为来一个数和进行堆顶的元素进行比较,然后进行向下调整,大的就下去了,因此最终统计的就是topK
3。给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确 算法和近似算法!
思路分析:
1。文件进行比较,用位图显然不能解决
2。肯定要进行哈希切分,我们将两个文件分别切分为1000个文件,先对文件A分的1000个文件里的整数进行哈希分配,即取出来整数模除1000,使相同的整出进入相同的文件,文件B切分的1000个文件进行同样的处理,然后分别拿A哈希切分好的第一个文件和B哈希切分好的第一个文件对比,找出交集存到一个新文件中,依次类推,直到2000个文件互相比较完。
4)给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它的文件,你只有100K内存!
1。用一个文件info 准备用来保存n个词和包含其的文件信息。
2。首先把n个词分成x份。对每一份用生成一个布隆过滤器(因为对n个词只生成一个布隆过滤器,内存可能不够用)。把生成的所有布隆过滤器存入外存的一个文件Filter中。
3。将内存分为两块缓冲区,一块用于每次读入一个布隆过滤器,一个用于读文件(读文件这个缓冲区使用相当于有界生产者消费者问题模型来实现同步),大文件可以分为更小的文件,但需要存储大文件的标示信息(如这个小文件是哪个大文件的)。
4。对读入的每一个单词用内存中的布隆过滤器来判断是否包含这个值,如果不包含,从Filter文件中读取下一个布隆过滤器到内存,直到包含或遍历完所有布隆过滤器。如果包含,更新info 文件。直到处理完所有数据。删除Filter文件。
5)有一个词典,包含N个英文单词,现在任意给一个字符串,设计算法找出包含这个字符串的所有英文单词!
可以用kmp算法或者字典树
来源:CSDN
作者:chuxinlgz
链接:https://blog.csdn.net/chuxinlgz/article/details/78585466