Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 根据权重在N个桶之间分配一组元素_C++_Algorithm - Fatal编程技术网

C++ 根据权重在N个桶之间分配一组元素

C++ 根据权重在N个桶之间分配一组元素,c++,algorithm,C++,Algorithm,给定N个桶和一些元素E1(W1)E2(W2)。我想根据元素的权重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 我必须将单个桶(5+5+10=20)加起来等于N。 我在考虑做这样的事情 bucket[i] = round(N*(W[i]/TOT_WGT) wh

给定N个桶和一些元素E1(W1)E2(W2)。我想根据元素的权重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
我必须将单个桶(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元素中的桶数,而不是计算元素I中的桶数,然后再减去第一个I-1元素中的桶数,得到元素I中的桶数


在这种情况下,前i个元素中的bucket数可以是四舍五入的(N*SUM_k_up_to_i(W[k])/TOT_WGT)。在这种情况下,所有桶中的元素数量都是四舍五入的(N*TOT_WGT/TOT_WGT),很可能总和为N,并且在任何情况下都可以用N替换,并且可以保证桶的总和为N。

最好的方法是不使用其宽度表示箱子。您试图表示一个连续的区间,通过对齐子区间的并集来实现这一点至少可以说是很棘手的

相反,计算内部分隔符的位置(示例中为{5,10}),然后将存储桶表示为成对的端点(示例中的端点为{0,5,10,20})。每当需要箱子的宽度时,返回该箱子两个端点之间的差值。是的,箱子的宽度可能与重量相差一点,但是如果你的应用程序对这个错误很敏感,你应该使用精确的数字类型