随机遍历大量列表的理想方式?

时间:2016-07-03 23:37:43

标签: list

我有一个庞大的数字列表(数千万),我想以随机顺序浏览它们而不重复

在C ++,Java,Python中有没有一种有效的方法呢?

1 个答案:

答案 0 :(得分:2)

在C ++中,这可能会:

std::list<T> foo;
std::vector<T *> bar(foo.size());
std::transform(foo.begin(), foo.end(), bar.begin(),
    [](T &a) -> T *
    { 
        return &a;
    });
std::random_shuffle(bar.begin(), bar.end());
for (auto &one_bar: bar)
    do_whatever(*one_bar);

基本上,创建一个相同大小的向量,并将指向原始列表的指针复制到向量中,然后对向量进行洗牌。现在,您可以单步执行并按随机顺序对每个元素调用do_whatever(T)

此外,如果您希望消除重复值:

std::list<T> foo;
std::vector<T *> bar(foo.size());
std::transform(foo.begin(), foo.end(), bar.begin(),
    [](T &a) -> T *
    { 
        return &a;
    });
std::sort(bar.begin(), bar.end(),
    [](T *a, T *b) -> bool
    { 
        return *a > *b; 
    });
std::unique(bar.begin(), bar.end(),
    [](T *a, T *b) -> bool
    { 
        return *a == *b; 
    });
std::random_shuffle(bar.begin(), bar.end());
for (auto &one_bar: bar)
    do_whatever(*one_bar);

假设您的班级已定义了这些运算符。