有效地从未排序数组中获取前50个最高的数字

Getting top 50 highest numbers from an unsorted array efficiently

本文关键字:50个 数字 获取 排序 数组 有效地      更新时间:2023-10-16

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

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

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

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