有效地从未排序的阵列中获得前50个最高数字

时间:2013-05-24 05:16:06

标签: c++ arrays max min

假设我们在数组中有一个大型数据集(比如50000),我们现在想要获得数组中前50个最高数字,你会建议使用优先级队列并弹出50次吗? 将数组中的每个50000个元素插入优先级队列可能需要达到O(n),如果你这样做50000次,它就会变成O(n ^ 2),这是很昂贵的。 如何获得更好的O复杂度?

1 个答案:

答案 0 :(得分:4)

您可以使用nth_element查找平均复杂度为O(n)的前50个元素,然后根据需要对数组的50个初始索引进行排序。

或者,您可以遍历数组,只要您的元素少于50个,或者当前项目高于第50个元素,就可以将项目放入单独的priority_queue中。每当你有51个元素时,你会弹出一个元素。最坏情况O(n * log(50))。

最后一点,如果数组中的所有值都低于某个限制,例如< = 10 ^ 5,则可以使用Bucket sort。只需遍历整个数组,然后执行++bucket[array[i]];。然后在bucket上线性迭代,记下你找到的50个最小数字。最差情况O(n) + O(m)其中m =数组中的最大值。