c++ - 计算分位数而不存储

标签 c++ algorithm quantile

我编写了 C++ 代码来计算 1 亿个 double 的 119 个分位数(从 10^-7 到 1 - 10^-7)。 我当前的实现将数字存储在一个 vector 中,然后对 vector 进行排序。 有什么方法可以在不存储数字的情况下计算分位数吗?

谢谢

附录(对不起我的英文): 这是我正在做的:

1) 在[0, 1)中生成20个均匀分布的随机数

2) 我将这些数字输入一个算法,该算法输出一个均值和方差未知的随机数

3) 存储第2步的数字

重复 1、2 和 3 1 亿次(现在我收集了 10^8 个均值和方差未知的随机数)。

现在,我使用公式“R-2,SAS-5”对这些数字进行排序,计算从 10^-7 到 1 - 10^-7 的 119 个分位数: https://en.wikipedia.org/wiki/Quantile#Estimating_quantiles_from_a_sample

由于程序是多线程的,内存分配太大,我只能使用5个线程而不是8个。

最佳答案

这是streaming algorithms领域的问题(您需要在不存储每个元素的情况下对数据流进行操作)。

分位数流算法有众所周知的算法(例如 here ),但如果您愿意使用分位数近似值,这是一个相当简单的问题。只需使用 reservoir samplingn 个元素中均匀采样 m,并计算样本的分位数(通过您所做的方法:将 m 样本存储在 vector ,并对其进行排序)。 m 的大小会影响近似值的精度(参见,例如 here)。

关于c++ - 计算分位数而不存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34471821/

相关文章:

c++ - 并行化时的不同答案

c++ - 传递字符串数组时出现段错误

javascript - 算法按给定数字从最近到最远对数组进行排序

R raster::calc 计算分位数 na.rm = FALSE

r - 未知累积函数的反函数

c++ - 以这种方式使用 boost::asio::strand 是否安全?

c++ - C++ 中的 Linux 进程加载器

algorithm - 确定算法的最坏情况复杂度

javascript - 如何用数组实现轮播

可靠地检索分位数函数的逆函数