大文件处理

1. 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?
  • 分而治之的思想
  1. 将IP 地址转换为整型,然后对100取模,相同取模结果的IP 地址会输出到一个文件中。
  2. 通过Hash表统计每个文件中最多的IP 地址
  3. 比较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的空间
  • 大文件处理_第1张图片
2.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

大文件处理_第2张图片

你可能感兴趣的:(java,java,算法,开发语言)