基于权重在N个桶之间分配一组元素
distrubute a set of elements between N buckets based on weights
给定N个桶和一些元素E1(W1)E2(W2)。我想根据元素Ei的权重Wi-在元素Ei之间分配N个桶
For example N = 20, W1 = 5 W2 = 5 W3 = 10 so
E1_buckets = 20*(5/20) = 5
E2_buckets = 20*(5/20) = 5
E3_buckets = 20*(10/20) = 10
I必须使各个桶(5+5+10=20)的总和达到N。我想做一些类似的事情
bucket[i] = round(N*(W[i]/TOT_WGT) where W[i] = element weight, and TOT_WGT = sum of weights W[i]
然而,我似乎可能会因为浮点数的表示不精确而遇到错误。浮点运算是否可以保证桶的总和始终为N?
另一种方法是总是发言,并将多余的部分分配给一些随机元素
bucket[i] = floor(N*(W[i]/TOT_WGT)
bucket[k] += (N-sum_of_buckets)
虽然它不能保证完美的加权,但我确实得到了桶和N的总和。有什么想法吗,我是不是错过了什么,有一个简单的方法可以做到这一点?
您可以计算前i个元素中的bucket数量,然后减去前i-1个元素中bucket的数量,而不是计算元素i中bucket数量。
在这种情况下,前i个元素中的桶的数量可以是四舍五入的(N*SUM_k_up_ti(W[k])/TOT_WGT)。在这种情况下,所有存储桶中的元素数量都是四舍五入的(N*TOT_WGT/TOT_WGT),很可能总和为N,并且在任何情况下都可以用N替换,并且可以保证存储桶的总和为N。
最好的方法是不使用bin的宽度来表示bin。你试图表示一个连续的区间,而通过对齐子区间的并集来实现这一点——至少可以说是很棘手的。
相反,计算内部分隔符的位置(在您的示例中为{5,10}),然后将您的桶表示为端点对(在示例中端点为{0,5,10,20})。每当您需要一个bin的宽度时,返回该bin的两个端点之间的差值。是的,垃圾箱的宽度可能与权重相差一点,但如果你的应用程序对这个错误很敏感,你真的应该使用精确的数字类型。
相关文章:
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 动态分配的数组和静态数组之间的区别
- make_pair和大括号 { } 之间的区别,用于在C++中分配一对?
- 如何在它们之间分配和使用 2 个不同类的函数指针?
- 按引用传递和动态内存分配之间的区别是什么
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- 计算机如何分配两个变量,我们如何计算两个变量之间的距离?
- 对这两个分配运营商之间的不同感到困惑
- 2 点分配之间的 C++ 距离
- 为什么分配的变量地址之间相差 16 个字节?
- 将工作与固定数量的螺纹之间的工作和pthread之间的分配
- 分配列表和初始化器列表之间 C++11 缩小的差异
- 为什么我会看到在堆和堆栈上分配的阵列之间的不同行为
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 分配指针的方法之间有什么区别?
- 在C++容器中,作为模板参数提供的分配器和作为构造函数参数提供的分配程序之间的区别
- C++均匀地分配单词之间的空格
- 将数组分配在固定数量的线程之间
- 理解C++中双指针和单指针内存分配之间的区别的问题