【问题标题】:A large file containing 1 million integers, what would be the fastest way to find the most occurring?一个包含 100 万个整数的大文件,找到最常出现的整数的最快方法是什么?
【发布时间】:2018-05-28 16:46:28
【问题描述】:

基本方法是使用数组或哈希图来创建数字直方图并选择最频繁的。

在这种情况下,我们假设文件中的所有数字都无法加载到主内存中。

我能想到的一种方法是使用外部合并/快速排序进行排序,然后逐块计算频率。由于它们是排序的,我们不必担心在带有数字的序列结束后再次出现数字。

有没有更好更有效的方法来做到这一点?

【问题讨论】:

  • 这是一个面试题吗?为什么一百万个整数放不下内存?
  • 数字的范围是多少
  • 使用 Unix 运算符对其进行流式传输...使用 head -n1 查找最大值。 unix.stackexchange.com/q/170043/148686
  • 是的,这是一个面试问题。数字的范围未知。
  • @kevmo314 因为您正在使用一个可用内存非常有限的系统?或者,让我们将其设为一万亿长整数。这个想法是您拥有的数据超出了可用内存的容量。实际数字并不重要。

标签: algorithm frequency


【解决方案1】:

嗯,一百万已经不是那么多了,所以假设我们谈论的是几十亿个整数。

在这种情况下,我建议您将它们散列并使用顶部 N 将它们划分为 2^N 个存储桶(单独的文件或同一文件的预分配部分) > 它们的哈希值位。

您会选择 N,以便生成的存储桶很可能小到足以在内存中处理。

然后,您将通过计算哈希表或类似表中每个唯一值的出现次数来处理每个存储桶。

万一存储桶有太多唯一值无法放入 RAM,请使用散列的下 N 位重新分区,然后重试。

【讨论】:

  • 任何哈希函数都可以使用,好的哈希函数不太可能导致分区不均匀。
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2014-09-10
  • 2021-10-06
  • 2013-07-17
  • 2011-01-15
  • 1970-01-01
相关资源
最近更新 更多