在阵列中打印K最小数字(不是最小的第k个)

时间:2018-01-25 16:53:11

标签: arrays algorithm sorting data-structures

我正在面试。

采访者:你有一个数组,你必须在该数组中找到k个最小的元素,你必须高效吗?
EX:[2,1,4,5,0],如果输入为3,则输出为0,1,2。

ME:我将获取k个变量并迭代数组的每个元素,并将所有不同的k个最小值存储在k个不同的变量中。

采访者:如果你有数百万的数据并且你必须找到10000个最小的变量怎么办?

ME:是的,取10000个变量实际上是不可能的。所以,我将在数百万个数据上迭代冒泡10,000次。

采访者:不,好的下一个问题!

  

所以,我想知道找到k最小的正确方法是什么   数组中的数字,特别是当k是一个非常大的数字时?

2 个答案:

答案 0 :(得分:2)

首先,我们需要找到数组的第k个最小元素。这可以使用任何selection algorithm来完成。

  

在计算机科学中,选择算法是用于在列表或数组中找到第k个最小数字的算法;这样的数字称为第k阶统计量。

然后我们需要像快速排序算法那样进行分区操作。分区重新排序数组,使得值小于第k个最小元素的所有元素都在它之前,而值大于第k个最小元素的所有元素都在它之后。分区的复杂性为O(n)

选择算法的一个非常简单的实现是Quickselect算法(包括分区),类似于Quicksort。在一般情况下,算法的复杂性为O(n)

在最坏的情况下,有更复杂的方法可以在O(n)中找到第k个最小元素(第k个顺序统计量),例如Median of median algorithm。但我认为Quickselect足以回答面试问题。

答案 1 :(得分:1)

这可以使用MinHeap来解决。 MinHeap以父节点的值始终小于其子节点的方式存储节点。要从MinHeap中提取最小值,必须提取根值。

从数组构建MinHeap需要O(n)时间复杂度。 (n是值的数量)

在提取根节点之后,为了找出下一个最小值,我们必须用堆的数组表示中的最后一个值替换它,并将HeHeapify。 这需要O(logn)时间复杂度。

假设N是数组中的值的数量,并且要求您找到K个最小值。然后,通过使用该方法,将花费O(N + K log(N))时间复杂度。例如,如果N是10 6 且K是10 3 ,则需要大约10 6 + 2 * 10 4 < / sup>迭代,大约需要不到1秒。虽然编写代码非常复杂。