我编写了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个。
答案 0 :(得分:4)
这是streaming algorithms领域的问题(您需要在不存储每个元素的情况下对数据流进行操作)。
有众所周知的分位数流算法算法(例如here),但如果你愿意使用分位数近似,那么它就是一个相当容易的问题。只需使用reservoir sampling从 n 元素中均匀地采样 m ,然后计算样本上的分位数(通过您执行的方法:存储 m 向量中的样本,并对其进行排序)。 m 的大小会影响近似值的精度(例如,参见here)。
答案 1 :(得分:2)
在计算分位数之前,您需要知道这组数字。
这可以通过存储数字来完成,但您也可以制作/使用多次传递算法,每次运行时都会学习一点。
如果分位数上的某些不准确性是可接受的,则还存在针对此问题的近似一次通过算法。以下是一个示例:http://www.cs.umd.edu/~samir/498/manku.pdf
编辑**忘了,如果你的号码有很多重复,你只需要存储号码和出现的次数,而不是每次重复。根据输入数据,这可能是一个显着的差异。