【问题标题】:Fastest way to sort a data structure in C++在 C++ 中对数据结构进行排序的最快方法
【发布时间】:2016-10-06 12:05:46
【问题描述】:

我有一个数据结构,它由三个表示坐标的int 值和一个表示该坐标处的值的double 组成。我想将它们存储在一起,并按价值对它们进行排序。值不是唯一的。现在,我将它们放在struct 中,并使用 lambda 对它们进行排序,如下面的代码所示。由于这是一段对性能至关重要的代码,我正在寻找一种能够提供最快排序的实现。该列表将包含 10^6 到 10^7 个元素。

解决这个问题的最优雅的方法是什么?我没有尝试使用std::sort,但我主要是在问是否将数据存储在struct 中是最好的解决方案,还是有更好的选择?

#include <vector>
#include <algorithm>
#include <iostream>

struct Data
{
    int i;
    int j;
    int k;
    double d;
};

int main()
{
    std::vector<Data> v;

    v.push_back({1,2,3,0.6});
    v.push_back({1,2,3,0.2});
    v.push_back({1,2,3,0.5});
    v.push_back({1,2,3,0.1});
    v.push_back({1,2,3,0.4});

    std::sort(v.begin(), v.end(), [](const Data& a, const Data& b)
            { return a.d < b.d; });

    for (auto d : v)
        std::cout << d.i << ", " << d.j << ", "
                  << d.k << ", " << d.d << std::endl;

    return 0;
}

【问题讨论】:

  • 了解我的问题出了什么问题会很有帮助。
  • “最快的排序方式”几乎是过于宽泛的定义。这取决于太多的事情:您的编译器和选项、您的目标系统架构、要排序的元素数量、排序之前元素的排列方式。您很可能必须自己实现一些算法并使用真实数据运行性能测试
  • 而 99% 的情况下,答案是“你可以编写和调试这个几百行的文件,它平均会比 std::sort 快 0.5%”。只需使用std::sort
  • 取决于how fast 您是否需要它以及您要对多少数据集执行排序?如果您需要它更快,我建议将 double 连同其在向量中的原始索引一起存储在一个单独的容器中。这将允许在排序时将更多元素加载到缓存中。但是,稍后访问向量元素可能会由于通过索引进行随机访问而使性能下降一点。所以,这一切都取决于你真正想要什么。
  • @Chiel 如果仅在字段d 上进行排序并且不使用ijk,那么您可能得到一个通过将ijk 重新排序到Data 指向的另一个结构中来获得优势。这将减少一些复制开销。然而,这里的优势可以忽略不计,并且会使其他操作慢得多。

标签: c++ sorting c++11 std


【解决方案1】:

对它们进行排序的最快方法是不必对它们进行排序。

以稍微慢一些的插入为代价,您可以将整个容器排序存储,并且只插入正确的位置。 std::set 可以在这里为您提供帮助,或者您可以自己动手。

编辑:如果您需要允许比较相等的值,std::multiset 将提供相同的优势。

【讨论】:

  • 我不知道那个。谢谢
  • 我要指出这也取决于使用情况。如果您通常会填充您的结构,然后在使用前排序一次,那么这可能会比填充和排序效率低。如果您将在代码中定期排序,这可能会更快。
【解决方案2】:

重复问题,Fastest way to search and sort vectors 比我能给出的答案要好得多。

总结,
你需要一个更好的样本集,5 个条目不会告诉你任何事情。您将无法击败 std::sort。特别是对您而言,浮点比较将是痛苦的一点。

【讨论】:

  • 我确实想使用排序,我主要怀疑struct 是否是正确的数据类型,或者我是否应该使用std::pair
最近更新 更多