1. 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?
- 分而治之的思想
- 将IP 地址转换为整型,然后对100取模,相同取模结果的IP 地址会输出到一个文件中。
- 通过Hash表统计每个文件中最多的IP 地址
- 比较100个文件中出现次数最多的IP地址即为结果
与上题条件相同,如何找到top K的IP?
-概念:
大根堆用于升序排序(所以求最小的前k个数用大根堆),小根堆用于降序排序(所以求最大的前k个数(常见的topk问题,基本都是求最大的前k个数)用小根堆)。
- 堆排序的时间复杂度是O(NlogN),空间复杂度是O(1),在海量数据及内存不足的条件下
- 首先设置一个大小为K的堆(最大top建最小堆,最小topk,使用最大堆)
- 扫描数组,与根结点比较,然后插入到堆中,并维护堆的特性
- 数组扫描结束,堆中的k个结点,就是topk
- 根据堆特性,交换根结点和最后一个叶子结点,原跟结点出堆,然后继续维持堆特性。直至最后一个结点,即为top k
给定100亿个整数,设计算法找到只出现一次的整数
- 整数4个字节,100亿整数,占用空间100亿*4=40G,整数范围0-42亿9千万
- 使用二进制2位标示可能出现的三种情况00 标识没有出现,01标识出现1次,11标示出现了1次以上
- 使用位图变形,使2个位标识一个数的状态。40亿整数只需要1G的空间
2.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
给一个超过100G大小的日志文件, 日志中存着IP地址, 设计算法找到出现次数最多的IP地址?
- 将日志文件的每个ip对1000取余,100G文件分成1000个小文件,每个文件100MB,电脑内存够用了。
- 多有相同的ip都进入到了同一个文件。统计每个文件中的ip出现的次数。可以利用hash桶的kv模型对每个文件的ip出现次数进行统计
给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集
- 将其中的一个文件所有整数建立位图,然后读取另一个文件里面 的整数,去位图里面查,查到了,就是两个文件的交际,没找到则该整数不是两文件的交集
给定100亿个整数,设计算法找到只出现一次的整数
- hash分成100份文件,然后比较各自文件中出现一次的整数