文件搜索

文件搜索

10亿个数中如何高效地找到最大的一个数以及最大的第K个数

10亿个数中如何高效地找到最大的一个数

将10亿个数据分成1000份,每份100万个数据,找到每份数据中最大的那个数据,最后在剩下的1000个数据里面找出最大的数据。 从100万个数据遍历选择最大的数,此方法需要每次的内存空间为10^6*4=4MB,一共需要1000次这样的比较。

10亿个数中如何高效地找到第K个数

对于top K类问题,通常比较好的方案是分治+hash+小顶堆

  • 先将数据集按照Hash方法分解成多个小数据集
  • 然后用小顶堆求出每个数据集中最大的K个数
  • 最后在所有top K中求出最终的top K。

如果是top词频可以使用分治+ Trie树/hash +小顶堆

  • 先将数据集按照Hash方法分解成多个小数据集
  • 然后使用Trie树或者Hash统计每个小数据集中的query词频
  • 之后用小顶堆求出每个数据集中出频率最高的前K个数
  • 最后在所有top K中求出最终的top K。

时间复杂度:建堆时间复杂度是O(K),算法的时间复杂度为O(NlogK)

参考