我想在 C++ 中生成大量有序且均匀分布的随机数,n, (即n >= 1,000,000,000)。
一首我认为,简单的方法是
n使用std::uniform_real_distribution<double>,顺序生成均匀分布的数字,std::sort.但是,这需要几分钟时间。
一个第二和更先进的方法是做并行的两个步骤为:
template <typename T>
void computeUniformDistribution(std::vector<T>& elements)
{
#pragma omp parallel
{
std::seed_seq seed{distribution_seed, static_cast<size_t>(omp_get_thread_num())};
std::mt19937 prng = std::mt19937(seed);
std::uniform_real_distribution<double> uniform_dist(0, std::numeric_limits<T>::max());
#pragma omp for
for (size_t i = 0; i < elements.size(); ++i)
{
elements[i] = static_cast<T>(uniform_dist(prng));
}
}
std::sort(std::execution::par_unseq, elements.begin(), elements.end());
}
Run Code Online (Sandbox Code Playgroud)
但是,即使这样也需要大约30秒。鉴于均匀分布数字的生成只需要大约1.5秒,瓶颈仍然是排序阶段。
因此,我想问以下问题:如何以排序的方式有效地生成均匀分布的数据?
让我们考虑以下 CSV 文件test.csv:
"x","y","A","B"
8000000000,"0,1","0.113948,0.113689",0.114042
8000000000,"0,1","0.114063,0.113823",0.114175
8000000000,"0,1","0.114405,0.114366",0.114524
8000000000,"0,1,2,3","0.167543,0.172369,0.419197,0.427285",0.427576
8000000000,"0,1,2,3","0.167784,0.172145,0.418624,0.426492",0.428736
8000000000,"0,1,2,3","0.168121,0.172729,0.419768,0.427467",0.428578
Run Code Online (Sandbox Code Playgroud)
我的目标是通过组的列线"x"和"y"和计算的算术平均值在列"A"和"B"。
我的第一个方法是使用的组合groupby(),并mean()在熊猫:
import pandas
if __name__ == "__main__":
data = pandas.read_csv("test.csv", header=0)
data = data.groupby(["x", "y"], as_index=False).mean()
print(data)
Run Code Online (Sandbox Code Playgroud)
运行此脚本会产生以下输出:
x y B
0 8000000000 0,1 0.114247
1 8000000000 0,1,2,3 0.428297
Run Code Online (Sandbox Code Playgroud)
正如我们所见,实现单值列的目标"B"很简单。但是,该列"A"被省略。相反,我希望该列"A"带有一个字符串,其中包含每个逗号分隔值的算术平均值。所需的输出应如下所示:
x y A B
0 8000000000 0,1 0.114139,0.113959 0.114247
1 8000000000 0,1,2,3 0.167816,0.172414,0.419196,0.427081 0.428297
Run Code Online (Sandbox Code Playgroud)
有人知道怎么做这个吗?
我想k按键合并排序的成对键/值向量。n通常,向量的大小非常大(例如, n >= 4,000,000,000)。
考虑以下示例k = 2:
// Input\nkeys_1 = [1, 2, 3, 4], values_1 = [11, 12, 13, 14]\nkeys_2 = [3, 4, 5, 6], values_2 = [23, 24, 25, 26]\n\n// Output\nmerged_keys = [1, 2, 3, 3, 4, 4, 5, 6], merged_values = [11, 12, 13, 23, 14, 24, 25, 26]\nRun Code Online (Sandbox Code Playgroud)\n由于__gnu_parallel::multiway_merge它是一种高效的k单向合并算法,因此我尝试利用最先进的 zip 迭代器(https://github.com/dpellegr/ZipIterator)来“组合”键值对向量。
#include <iostream>\n#include <vector>\n#include <parallel/algorithm>\n\n#include "ZipIterator.hpp"\n\nint main(int argc, char* argv[]) …Run Code Online (Sandbox Code Playgroud)