我更新鲜,准备采访。在我最近的采访中,我被问到一个问题,我找不到合适的答案。
我得到了大约100个文件,每个文件都包含大量以逗号分隔的整数。我必须在整个文件中找到前10个整数。我试图用堆来解决它。但我对这个过程的时间复杂性感到困惑。任何帮助将不胜感激,谢谢。
答案 0 :(得分:1)
我认为你使用堆数据结构是正确的。
您可以并行处理文件,对于每个文件,您可以维护一个大小为10的最小堆。
当你遍历一个文件时,你会在min-heap中插入一个值,直到它满(大小为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(文件数)min-sheaps,每个大小为10.这里你可以使用最终的min heap来存储m min-heap中包含的十个最大数字。这个计算将是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)。