计算分位数而不存储
Calculating quantiles without storing
我写了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
编辑**忘记了,如果你的数字有很多重复,你只需要存储数字和它出现的次数,而不是每个重复。根据输入数据,这可能是一个显著的差异。
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- 如何从存储在 QByteArray 中的十六进制值计算校验和
- 如何计算字符串并将其存储在变量中
- 视觉 C++编译器在计算其参数之前是否允许将函数 ptr 存储在寄存器中?
- 计算数组中特定线的平均值并存储在另一个数组中
- 从数组中获取值并计算平均值,然后存储在数组中
- 如何使用二维数组来计算和存储来自其他数组的值的频率
- 存储两个3-D向量的数据并计算点产品
- 如何存储和获取先前计算的值
- 在SQLite中存储日期和计算年龄
- 计算存储在向量中的值流的移动平均值
- 浮点计算更改(如果存储在中间变量中"double"
- 在用户计算机上存储密钥的推荐方法
- 使用指针数组存储阶乘计算的所有中间结果
- 计算分位数而不存储
- 制作一个数组,将计算出的数字存储在内存中
- 我应该如何存储和计算二进制代码之间的汉明距离
- 在哪里存储Visitor模式中访问的每个元素的计算结果
- 如何计算存储在map中vector中的元素数量