二项分布压缩

Binomial Distribution Compression

本文关键字:压缩 二项分布      更新时间:2023-10-16

我目前很难为问题想出一个快速和低内存的解决方案。我正在尝试使用二项分布来解决。我有一个二项分布,可以取 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];
 }