2015-01-13 87 views
1

我正在用Python,MPI和FFTW進行一些並行編程。我需要在N個進程之間平均分配一個長度爲G的向量(或者儘可能接近平等)。這導致以下數學問題:平均分配內存(或儘可能公平)

給定兩個整數G,N,其中G> N,我想找到總和等於G的N個整數的集合S,並且其中「所有整數儘可能大」 。

實例:

G = 14,N = 3 - > S = {5,5,4}

G = 15,N = 3 - > S = {5,5, 5}

G = 16,N = 3 - > S = {6,5,5}

算法來計算S IN FFTW由函數fftw_mpi_local_size被實現。我希望能夠使用Python自己計算這個。也就是說,我正在尋找一種解決我的問題的算法,或者更好的是現有的可以完成這項工作的Python函數。

回答

2

我這樣做的方法是找到均勻分佈在N元素中的最小值,您可以使用整數除法。然後使用%來查找其餘部分,並將1添加到該元素數量。

def makeValues(G,N): 
    val = G//N 
    rem = G%N 
    return [val]*(N-rem) + [val+1]*rem 

>>> makeValues(14,3) 
[4, 5, 5] 
>>> makeValues(15,3) 
[5, 5, 5] 
>>> makeValues(16,3) 
[5, 5, 6]