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