簡體   English   中英

在一定數量的塊之間分配數字的算法

[英]Algorithm for distributing a number between certain number of chunks

我正在尋找一種算法,用於在一定數量的塊之間拆分數字。 真正的例子是:根據任務總數為所有工作人員分配初始能力。

例如,如果有3個人和6個任務。 每個將具有初始容量= 6 / 3 = 2

我想出一個實現。 但是,我不確定這是否是實現它的最佳方法。

def capacity_distribution(task_size, people_size):
    """
    It distributes initial capacity to each person.
    """
    div = task_size // people_size

    remainder = task_size % people_size

    first_chunk_size = people_size - remainder
    second_chunk_size = people_size - first_chunk_size

    first_capacity_list = []
    second_capacity_list = []
    first_capacity_list = [div for _ in range(first_chunk_size)]
    second_capacity_list = [div + 1 for _ in range(second_chunk_size)]
    first_capacity_list.extend(second_capacity_list)

    return first_capacity_list



print(capacity_distribution(6, 2))
print(capacity_distribution(7, 3))
print(capacity_distribution(11, 3))
print(capacity_distribution(18, 5))

輸出:

[3, 3]
[2, 2, 3]
[3, 4, 4]
[3, 3, 4, 4, 4]

還有其他有效的方法嗎?

也許:

def capacity_distribution(task_size, people_size):
    each = math.floor(task_size/people_size) # everyone gets this many
    extra = task_size % people_size # this many get 1 extra

    distribution = [each for x in range(people_size)]
    for x in range(people_size):
        if x < extra:
            distribution[x] += 1

    return distribution

這個怎么樣?

def capacity_distribution(task_size, people_size):
    modulus = task_size % people_size
    div = task_size // people_size

    dist = []

    if modulus:
        dist.append(div)
        dist.extend(capacity_distribution(task_size-div, people_size-1))
    else:
        dist.extend([div]*people_size)

    return dist

我的解決方案是:

def cap_distr(ts, ps):
    l = [ts // ps for _ in range(ps)]
    for i in range(ts % ps):
        l[i] += 1
    return l

測試:

for test in [(6, 2), (7, 3), (11, 3), (18, 5)]: print(cap_distr(*test))
[3, 3]
[3, 2, 2]
[4, 4, 3]
[4, 4, 4, 3, 3]

PS:如果您不介意導入numpy,它甚至會短一行:

from numpy import ones

def cap_distr(ts, ps):
    arr = ones(ps) * (ts // ps)
    arr[:ts % ps] += 1
    return arr.astype(int)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM