最优再分配算法
Optimum redistribution algorothm
假设我有一桶相同的物品(n 个)分布在相同的桶(m 个)中。给定的分布可能是也可能不是 fair/uniform。目标是编写一个算法,可以通过转移一些项目来统一重新分配这些项目。每次转账都有相关费用,所以转账次数必须最少。
例如,我在这个分布的 3 个桶中总共有 7 个项目。输入是大小为 'm' 的向量,每个桶中的项目数为 - 4, 2, 1
解决方案将涉及从存储桶 1 到存储桶 3 的 1 次传输,结果分布将类似于 - 3, 2, 2
由于 n(7) 不能被 m(3) 完全整除,这是最接近的可实现的均匀分布。
另一个示例案例-
输入:{1, 4, 5, 11}
输出:{5, 5, 5, 6}
到达输出的传输次数:5
我正在寻找一些可以解决此问题陈述的现有算法。谢谢!
虽然您的用例不需要在实施中考虑太多,但由于数字显然很小,有时可能需要使用时间复杂度基本上不依赖于项目数量的算法,e . g.:
import numpy as np
def dist(inp):
inp = np.array(inp)
m = len(inp) # number of buckets
n = sum(inp) # number of items
l = n//m # low number in an output bucket
h = (n+m-1)//m # high number in an output bucket
lo = inp < l # buckets which need transfer to
hi = inp > h # buckets which need transfer from
out = np.empty(m, int)
out[lo] = l # fill underfull buckets with low
out[hi] = h # fill overfull buckets with high
out[~lo & ~hi] = inp[~lo & ~hi] # keep other buckets as is
o = sum(out) # check missing or surplus items
if o < n: out[np.where(out == l)[0][:n-o]] = h # adjust
if o > n: out[np.where(out == h)[0][:o-n]] = l # adjust
return out
假设我有一桶相同的物品(n 个)分布在相同的桶(m 个)中。给定的分布可能是也可能不是 fair/uniform。目标是编写一个算法,可以通过转移一些项目来统一重新分配这些项目。每次转账都有相关费用,所以转账次数必须最少。
例如,我在这个分布的 3 个桶中总共有 7 个项目。输入是大小为 'm' 的向量,每个桶中的项目数为 - 4, 2, 1
解决方案将涉及从存储桶 1 到存储桶 3 的 1 次传输,结果分布将类似于 - 3, 2, 2
由于 n(7) 不能被 m(3) 完全整除,这是最接近的可实现的均匀分布。
另一个示例案例- 输入:{1, 4, 5, 11}
输出:{5, 5, 5, 6}
到达输出的传输次数:5
我正在寻找一些可以解决此问题陈述的现有算法。谢谢!
虽然您的用例不需要在实施中考虑太多,但由于数字显然很小,有时可能需要使用时间复杂度基本上不依赖于项目数量的算法,e . g.:
import numpy as np
def dist(inp):
inp = np.array(inp)
m = len(inp) # number of buckets
n = sum(inp) # number of items
l = n//m # low number in an output bucket
h = (n+m-1)//m # high number in an output bucket
lo = inp < l # buckets which need transfer to
hi = inp > h # buckets which need transfer from
out = np.empty(m, int)
out[lo] = l # fill underfull buckets with low
out[hi] = h # fill overfull buckets with high
out[~lo & ~hi] = inp[~lo & ~hi] # keep other buckets as is
o = sum(out) # check missing or surplus items
if o < n: out[np.where(out == l)[0][:n-o]] = h # adjust
if o > n: out[np.where(out == h)[0][:o-n]] = l # adjust
return out