计算分位数而不存储

Calculating quantiles without storing

本文关键字:存储 计算      更新时间:2023-10-16

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

谢谢

附录(对不起我的英语):以下是我正在做的:

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个。

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

分位数流算法有一些众所周知的算法(例如,这里),但如果你愿意使用分位数近似,这是一个相当容易的问题。只需使用储层采样,即可对n元素中的m进行均匀采样,并计算样本上的分位数(使用您所使用的方法:将m样本存储在向量中,并对其进行排序)。大小m会影响近似的精度(例如,请参见此处)。

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

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

如果分位数上的一些不准确度是可以接受的,那么这个问题也有近似的一次通过算法。以下是一个示例:http://www.cs.umd.edu/~samir/498/manku.pdf

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