与在C 中使用QSORT相比,我该如何将一百万个数字分组
How can I group a million numbers faster than using qsort in C++?
我如何将一系列整数编号分组,例如[4,2,3,3,2,4,1,2,4]4、2、2、2、3、3、1],无需使用任何排序算法。
请注意,我不需要以任何排序的顺序进行结果,但是我确实需要建议的算法要比Qsort快100万个数字。
如果您不太在乎使用额外的空间,这应该有效。它首先将每个数字的出现数量存储在unordered_map
中,然后创建一个载体,该向量包含地图中的每个值,重复原始vector
中看到的次数。有关此操作的工作方式,请参见文档。unordered_map
的[]
操作员平均在O(1)
中工作。因此,创建unordered_map
需要O(N)
时间。通过地图迭代并再次填充返回向量需要O(N)
时间,因此整个过程应在O(N)
中运行。请注意,这将创建两个额外的数据副本。
在最坏的情况下,[]
操作员需要O(N)
时间,因此真正知道这是否比qsort
更快的唯一方法是测量它。
#include <vector>
#include <unordered_map>
#include <iostream>
std::vector<int> groupNumbers(const std::vector<int> &input)
{
std::vector<int> grouped;
std::unordered_map<int, int> counts;
for (auto &x: input)
{
++counts[x];
}
for (auto &x: counts)
{
grouped.insert(grouped.end(), x.second, x.first);
}
return grouped;
}
// example
int main()
{
std::vector<int> test{1,2,3,4,3,2,3,2,3,4,1,2,3,2,3,4,3,2};
std::vector<int> result(groupNumbers(test));
for (auto &x: result)
{
std::cout << x << std::endl;
}
return 0;
}
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 如何将字符串拆分为一组 3 个字符,它们之间有空格
- 如何快速删除数百万个文件
- 与在C 中使用QSORT相比,我该如何将一百万个数字分组
- 应用一组 N 个函数的第一个有效函数
- 打印可以由一组n个字符组成的长度为k的所有排列
- C++:在不传递一百万个参数的情况下分解代码
- 如何生成一组偶数个的枚举
- 面试难题:用有限的记忆对输入的一百万个数字进行排序
- 给定一组 12 个整数,如何递归生成所有可能的 4 组 3 个整数?C++
- 有效地处理 C/C++ 中的函数调用了一百万次
- 在C++中为数百万个对象创建映射
- 对百万或十亿个 STL 向量进行排序和连接的最快方法
- 给定数百万个点,查找位于直线上或距离直线0.2 mm范围内的点
- 拔河:将一组n个对象int划分为多个子集
- c++将输出(数字)保存到一个数组中.一次两个数字
- 从stdin c++中读取数百万个整数的最快方法
- 创建一百万个对象,每个对象有12个double
- c++一个头多个源
- 一次两个字符串算法