二项分布压缩
Binomial Distribution Compression
我目前很难为问题想出一个快速和低内存的解决方案。我正在尝试使用二项分布来解决。我有一个二项分布,可以取 5 个值,值出现的概率为 1/16、4/16、6/16、4/16、1/16。我目前正在使用 4 位数字访问大小为 16 的二项式分布数组,其中包含 5 个值,其出现次数与其概率成正比。有没有办法将数组压缩到大小 5,并且仍然能够快速确定要访问数组中的哪个元素。我考虑过使用 Karnaugh 映射,但是所需的逻辑操作数量减慢了整个过程。是否存在某种压缩或技术来快速实现这一点,因为我希望增加二项分布的大小,由于内存或计算时间的增加,目前这是不可行的。
binomialCoefficients[16]= {v1, v2, v2, v2, v2, v3, v3, v3, v3, v3, v3, v3, v4, v4, v4, v4, v5};
for (int i = 0; i < steps; i++) {
uint random = MWC64X(&seed2);
currentValue = currentValue * binomialCoefficients[random & 0b1111];
}
与
binomialCompressed[5]={v1,v2,v3,v4,v5};
for (int i = 0; i < steps; i++) {
uint random = MWC64X(&seed2);
bool A = (random & 0b1000) >>3;
bool B = (random & 0b0100) >>2;
bool C = (random & 0b0010) >>1;
bool D = (random & 0b0001);
uint logicMappedIndex = (A&B&C&D)<<2 + (A&!B|...)<<1 +...;
currentValue = currentValue * binomialCompressed[logMappedIndex];
}
生成随机数时,每个位的概率为 1/2。如果你只是计算位,它已经给你压缩数组中具有二项式概率的索引。
binomialCompressed[5]={v1,v2,v3,v4,v5};
for (int i = 0; i < steps; i++) {
uint random = MWC64X(&seed2) & 0b1111; //Get 4 bits only
uint count = popcount(random);
currentValue = currentValue * binomialCompressed[count];
}
相关文章:
- 将二维矢量传递给类
- 二叉排序树无法编译
- C++中高效的大型稀疏块压缩线性方程
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 嵌入方指针压缩已禁用
- C++使用整数的压缩数组初始化对象
- 在计算中使用二的幂有多有利可图
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 如何从多映射中删除特定的重复项
- 输出 0 和 -0 的二次公式,与给定的项无关
- 从提升二项分布中抽取随机数
- 为什么不能将此参数包直接解压缩到向量初始值设定项列表中?
- 二项分布压缩
- 如何在跟踪原始索引的同时压缩向量(具有重复项)
- C++ 在二维映射(映射映射)中查找键匹配项
- 二维正态分布c++
- 二项堆实现运行太慢
- 在C++17中,可以使用带有初始值设定项的if语句来解压缩可选项
- C++二叉搜索树比较节点的数据并删除重复项
- 计算类似于二项和的条件概率