将n个元素分配给x组的最佳算法

时间:2016-05-20 15:59:59

标签: algorithm math optimization

n项(例如2到100)分配到x组的最佳方法是什么。 每个组中应包含大约相同数量的项目。

简单的例子是n=100; x=2;

  

100/2 =每组50件

如果我们涉及浮动数字,例如n=100; x=3;

,该怎么办?
  

100/3 = 33.33

我们需要两组嵌套33个项目和一组嵌套34 另一个例子:n=8; x=3

  

8/3 = 2.66

有关如何解决此问题的任何建议吗?

并不重要,但仅仅是对于好奇的头脑,用例: 在我的UI中,我试图将标签条划分为多行,一次只显示一行,这样如果所有标签条不适合一行,我们就可以通过编程方式分发它们。

期待您的回答!

2 个答案:

答案 0 :(得分:1)

floor(n / x)个项目分发到x个小组后,您将n mod x = n - floor(n / x) * x个项目留在[0, x)1。您可以使用i=1..x轻松地将i <= n mod x添加到每个群组for i=1..x group[i] <- floor(n / x) + (i <= n mod x ? 1 : 0)

for i=1..(n mod x)
   group[i] <- ceil(n / x)
for i=(n mod x + 1)..x
   group[i] <- floor(n / x)

这与

相同
n = 11, x = 3

E.g。 group[1] <- 3 + (1 <= 2 ? 1 : 0) = 4 group[2] <- 3 + (2 <= 2 ? 1 : 0) = 4 group[3] <- 3 + (3 <= 2 ? 1 : 0) = 3 您最终会:

# distutils: language = c
cdef extern from "myenum.h":
    cpdef enum strategy:
        slow,
        medium,
        fast

答案 1 :(得分:0)

假设您的群组采用某种形式的数组,从0开始使用&#39; groupCount&#39;群体,简单的分布&#34;按行&#34;会是这样的:

g = 0
for each element e
    allocate e to group groups[g]
    g++
    g = (g % groupCount)

如果一次分配给第一组元素的速度太慢,则可以更快地按列分配“#”。假设计数器剩下的元素&#39;和剩下的小组&#39;适当地初始化,它看起来像:

for each group g
    size = floor(remainingElements / remainingGroups)
    allocate size elements to group g
    remainingElements = remainingElements - size
    --remainingGroups