我有一个庞大的数字列表(数千万),我想以随机顺序浏览它们而不重复
在C ++,Java,Python中有没有一种有效的方法呢?
答案 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);
假设您的班级已定义了这些运算符。