【问题标题】:Find top 10 integers among 100 different files [closed]在 100 个不同文件中查找前 10 个整数 [关闭]
【发布时间】:2013-10-29 07:41:30
【问题描述】:

我是一名新生,正在准备面试。在我最近的采访中,我被问到一个问题,我找不到合适的答案。

给了我大约 100 个文件,每个文件都包含大量逗号分隔的整数。我必须在整个文件中找到前 10 个整数。我尝试使用堆来解决它。但我对这个过程的时间复杂度感到困惑。任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 相关/可能重复 - Algorithm to find top 10 search terms.
  • 文件是否包含唯一编号?也就是数字42可以在一个文件中出现多次吗?
  • 您是在寻找最大的 10 个整数,还是出现次数最多的 10 个整数?
  • 我被问到整个文件中的前十个最大整数

标签: algorithm


【解决方案1】:

我认为您在使用堆数据结构方面走在正确的轨道上。

您可以并行处理文件,并且您可以为每个文件维护一个大小为 10 的最小堆。

当您遍历一个文件时,您将一个值插入到最小堆中,直到它已满(大小为 10),然后对于位置 11 到 n 中的值

if current_value > min_heap.current()
    min_heap.extract()
    min_heap.insert(current_value)

您必须遍历 n 个值,最坏的情况是文件按升序排序。在这种情况下,您必须提取最小值并为位置 11 到 n 中的所有值插入一个新值。堆操作将为 O(log n),每个文件的总体运行时间为 O(n * log n)。

此时您有 m (# of files) 个最小堆,每个大小为 10。在这里您可以使用最终最小堆来存储 m 个最小堆中包含的 10 个最大数。此计算将是 O(m),因为此时所有堆的最大大小为 10,这是一个常数。

总体运行时间为 O(n * log n + m)。 m 可能比 n 小很多,所以在朋友中我们可以说 O(n * log n)。

即使您不并行执行第一步,也将是 O(m * n * log n + m),但如果 n 再次支配 m,我们可以说 O(n * log n)。

【讨论】:

  • 感谢您的算法,它帮助我摆脱了困惑 :)
  • 您的算法不起作用。想象一下,您正在寻找三个文件中最常见的数字(只有一个)。在这些文件中,数字 7 在每个文件中出现 8 次。但它是每个文件中第二常见的数字。在每个文件中,都有一些其他数字出现得更频繁,但总体数字 7 的出现频率高于任何其他数字。你的算法会给出错误的答案。
  • 我误解了“前 10 个整数”。我认为这意味着文件中的最大整数不是出现次数最多的整数。
  • 有了这个解释,你的算法就可以工作了。 OP的问题模棱两可。所以你可能不应该投反对票。我已经反转了。
猜你喜欢
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2013-06-16
  • 2021-03-10
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多