在不存储

时间:2015-12-26 13:33:54

标签: c++ algorithm quantile

我编写了c ++代码来计算1亿个双精度数的119个分位数(从10 ^ -7到1 - 10 ^ -7)。 我当前的实现将数字存储在向量中,然后对向量进行排序。 有没有办法在不存储数字的情况下计算分位数?

谢谢

ADDENDUM(对不起我的英文): 这就是我正在做的事情:

1)在[0,1]

中生成20个均匀分布的随机数

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

3)在第2步存储号码

重复1,2和3亿次(现在我收集了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个。

2 个答案:

答案 0 :(得分:4)

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

有众所周知的分位数流算法算法(例如here),但如果你愿意使用分位数近似,那么它就是一个相当容易的问题。只需使用reservoir sampling n 元素中均匀地采样 m ,然后计算样本上的分位数(通过您执行的方法:存储 m 向量中的样本,并对其进行排序)。 m 的大小会影响近似值的精度(例如,参见here)。

答案 1 :(得分:2)

在计算分位数之前,您需要知道这组数字。

这可以通过存储数字来完成,但您也可以制作/使用多次传递算法,每次运行时都会学习一点。

如果分位数上的某些不准确性是可接受的,则还存在针对此问题的近似一次通过算法。以下是一个示例:http://www.cs.umd.edu/~samir/498/manku.pdf

编辑**忘了,如果你的号码有很多重复,你只需要存储号码和出现的次数,而不是每次重复。根据输入数据,这可能是一个显着的差异。