与在C 中使用QSORT相比,我该如何将一百万个数字分组

How can I group a million numbers faster than using qsort in C++?

本文关键字:一百万 百万个 数字 QSORT 相比 与在      更新时间:2023-10-16

我如何将一系列整数编号分组,例如[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;
}