订购巨大载体的最快方法?

Posted

技术标签:

【中文标题】订购巨大载体的最快方法?【英文标题】:Fastest way to order a huge vector? 【发布时间】:2013-05-28 19:38:28 【问题描述】:

我正在寻找订购 220000 * 7 * 6 的多维向量的最快方法。

我按 [x][5][y] 排序,我必须使中间 (7) 向量的所有值都跟上。

for(int i =0;i<211876;i++)
    for(int k =0;k<211876;k++)
        if(vec[k][5][myposition] < vec[k+1][5][myposition])
            for(int n =0;n<7;n++)
            swap2int(vec[k][n][myposition],vec[k+1][n][myposition]);
        
    


void swap2int(int &one, int& two)
    int temp=0;
    temp = one;
    one = two;
    two = temp;

    return;

这有点慢,我正在寻找提高速度的方法。

【问题讨论】:

请清理代码。我看不到在哪里使用了“i”,并且在任何地方都没有“myposition”的定义。在我看来,您只是在对数组的每个“行”进行独立排序,这应该可以通过标准排序或者自定义迭代器类型来实现。但如果没有关于正在做什么的详细信息,我们将无能为力。 看起来你已经实现了冒泡排序,这是出了名的慢。看看这个list of popular sorting algorithms。基本上它们中的任何一个都会比你所拥有的更快。 ...除非你真的需要,否则编写自己的排序是重复的工作,你应该使用'',并使用 std::sort (cplusplus.com/reference/algorithm/sort) 你正在做二次排序,所以它很慢也就不足为奇了。更改您的数据结构,以便您可以使用 O(N log N) 的std::sort。最简单的方法是重新排列维度,所以它是 vec[myposition][k][n]。 【参考方案1】:

始终使用std::sort,除非您有非常很好的理由不这样做。 std::sort 允许您在必要时提供自己的排序标准,因此几乎没有任何理由不使用它。您可能需要在您的情况下提供一个跨步迭代器,但这些都很简单。

【讨论】:

如果可能,std::sort 会做 O(N) 风格的排序,还是会抓住 O(nlog n) 的品种?【参考方案2】:

您始终可以将它们放在最小堆中(从向量创建最小(或最大)堆平均需要 O(n)),然后,您可以简单地从最小堆中以完美的顺序提取数字,使用 O (log n) 每个 top()+pop() 操作的成本。这样,你会得到一个不错的 O(N log N) 成本,你会玩堆,这总是很有趣,并且可能比你更有趣(并添加一些让你再次在这里发帖的错误)刚刚使用 std::sort :P

或者你可以像之前所说的那样使用 std::sort ,而忘记其他一切;)

顺便说一句:在您的 swap2int() 函数中,如果您不使用它,则无需浪费时间将 0 分配给 temp。只需将其更改为:

int 温度; 临时=一个;

或直接到:

int temp=one;

【讨论】:

以上是关于订购巨大载体的最快方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中读取巨大 MySQL 表的最快方法

按相关表列排序表的最快方法

循环遍历数据框以消除数据中的巨大跳跃的最快方法

订购 n 个数字的最佳运行时间

将大量 .data 加载到数组中的最快方法

如何使用 StaggeredGridLayoutManager 订购项目