订购巨大载体的最快方法?
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;
【讨论】:
以上是关于订购巨大载体的最快方法?的主要内容,如果未能解决你的问题,请参考以下文章