【问题标题】:Sorting large array of pairs对大数组对进行排序
【发布时间】:2014-05-06 13:25:40
【问题描述】:

我需要一种算法,它可以根据每对的第一个元素对一组对的数组进行排序。以下代码适用于 v_size

#include <iostream>
#include <algorithm>
#include <iterator>
#include <time.h>

using namespace std;


int main( int argc, char ** argv )
{
    srand(time(NULL));

    int v_size=524000;
    std::pair<double, int> AB_large[v_size];

    for( int i = 0; i<v_size; ++i)
    {
      AB_large[i].first  = static_cast <double> (rand()) / static_cast <double> (RAND_MAX);
      AB_large[i].second = i;
    }

    std::sort(AB_large, AB_large+v_size);
    return 0;
}

【问题讨论】:

  • 与地址空间的数量相比并不算大。但是比起 stack 的空间量...
  • 你知道它至少有 6288000 字节吗?超过 5 GB 的内存。这可能比您拥有的堆栈空间还要多。
  • 你将如何处理冲突?
  • @JohnDibling:你的意思是当有两个元素的值相同时?
  • @pawel_winzig:对。

标签: c++ algorithm sorting stl std-pair


【解决方案1】:

看起来像堆栈溢出。

尽量不要对这么大的对象使用自动变量:

std::vector< std::pair<double, int> >AB_large(v_size);

// ...

std::sort(AB_large.begin(), AB_large.end());

【讨论】:

    【解决方案2】:

    你的数组是一个局部变量,所以它是在堆栈上创建的。堆栈大小通常有限制。在Linux上,通常可以通过ulimit命令查看和修改。 (在 Windows 上,C++ 可执行文件的堆栈限制是在编译时确定的,并且可以通过编译器选项或 pragma 进行更改。)

    一对实例的大小为 8+4=12 字节。默认堆栈限制通常为 8 MB。由于编译器的alignment 设置,可能会将 12 个字节填充到 16 个字节。所以,219 * 16 = 223 字节,也就是 8 兆字节。

    【讨论】: