在箱之间均匀分配数字

时间:2015-08-22 00:42:36

标签: python algorithm python-2.7

取一个 N 的数字,并在 i 箱中尽可能均匀地分配。
N 分布在 i 区间为[N 1 ,N 2 .... N i ],Σ(N a - N b )最小化所有a,b∈{0,1,.. i}

我必须在Python中这样做。到目前为止,我已经提出了一种简单的方法,其工作原理如下:

  • 每个bin的初始大小是N / i(整数除法)
  • 继续按顺序从整数除法的其余部分向每个bin添加1,直到余数用完为止。

代码:

def eq_div(N,x):
    a = [N/x for i in range(x)]
    rem = N%x

    def eq_map(val):
        global rem
        if rem > 0:
            rem -= 1
            return val + 1
        else:
            return val

    return map(eq_map, a)

这可行,但它使用了笨拙的global关键字。我错过了这样做的库函数吗?或者我可以不使用全局做同样的事情吗? 有没有更好的解决方案?

4 个答案:

答案 0 :(得分:1)

你可以循环并为每个第一个rem元素添加1。

答案 1 :(得分:1)

def eq_div(N, i):
    return [] if i <= 0 else [N / i + 1] * (N % i) + [N / i] * (i - N % i)

>>> eq_div(-10, 3)
[-3, -3, -4]

答案 2 :(得分:1)

这是我的尝试:)我认为它比原版更简单,更易读,因此更容易维护。 (我很反对函数式编程,ymmv)。

def pidgeon_hole(n, n_bins): 
    quotient = n // n_bins
    remainder = n % n_bins

    bins = [quotient for i in range(n_bins)]    
    for i in range(remainder):
        bins[i] += 1
    return bins


bins = pidgeon_hole(13, 3)
for bin in bins: 
    print(bin)

答案 3 :(得分:0)

在这种情况下,您可以使用非本地而非全局。