careercup-高等难度 18.6

18.6 设计一个算法,给定10亿个数字,找出最小的100万个数字。假定计算机内存足以容纳全部10亿个数字。

解法:

方法1:排序

按升序排序所有的元素,然后取出前100万个数,时间复杂度为O(nlog(n))

方法2:大顶堆

我们可以使用大顶堆来解题。首先,为前100万个数字创建一个大顶堆

然后,遍历整个数列,将每个元素插入大顶堆,并删除最大的元素。

遍历结束后,我们将得到一个堆,刚好包含最小的100万个数字。这个算法的时间复杂度为O(nlog(m)),其中m为待查找数值的数量。

方法3:选择排序算法(假如你可以改变原始数组)

在计算机科学中,选择排序是个很有名的算法,可以在线性时间内找到数组中第i个最小(或最大)元素。

如果这些元素各不相同,则可以在预期的O(n)时间内找到第i个最小的元素。

 

你可能感兴趣的:(UP)