有效地从未排序数组中获取前50个最高的数字
Getting top 50 highest numbers from an unsorted array efficiently
假设我们在一个数组中有一个大数据集(比如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 =数组中的最大值
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- C++通过数字比较两个数字
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 如果我不知道每个列表中有多少个数字,我如何将给定数量的数字列表作为输入?
- 获取 2 个数字之间的差异百分比
- 在 txt 文件中显示前两个数字的程序
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 两个数字的对称配对功能
- 将最多 50 位数字的 2 个数字相乘
- 查找中间两个数字的正则表达式的匹配项
- 使用C++具有两个数字的最短路径算法.(C++)
- 使用三个数字比较器进行排序
- 在 CPP 中交换 2 个数字
- 将两个数字添加为链表
- C++ 分段错误:11 错误,同时编码将两个数字相加的链接列表
- 在 C++ 中查找 2 个数字的 GCD
- 有效地从未排序数组中获取前50个最高的数字