2010-12-16 91 views
2

我有许多类别,每个类别都有一些元素。我现在正在寻找一种编程算法来将这些类别分布在预定义数量的列中,而不会打乱类别,保持类别顺序,并尽可能优化每列中元素的数量。编程算法:如何均匀分布列间的类别

例如: 分配5个类别横跨3列

Data: 
category A, 7 elements 
category B, 7 elements 
category C, 3 elements 
category D, 2 elements 
category E, 8 elements 

结果:

Column 1: category A, 7 elements 
Column 2: category B and C, 10 elements 
Column 3: category D and E, 10 elements 
+0

你如何定义最优?你的数据有多大(是蛮力的选择)? – 2010-12-16 10:50:18

+0

我认为最优化的定义是每列元素和总元素之差除以数列的差异尽可能小。我认为蛮力是一个选项,我期望可能有100列和1000个元素。 – vdrmrt 2010-12-16 10:59:13

回答

3

你必须元素的总数,这样你就可以通过列的数除以数量获取每列中预期的元素数量。然后,你的工作就是尽量减少差异的平方和(因此,如果你必须存储8个元素并存储10个元素,那么这个列的平方差为2 2 = 4)。

然后,您可以编写一个递归函数,为每个类别决定是将该类别移动到下一列,还是将其保留在当前列中。这是一个布尔决策,因此您可以从创建最小差异的分支开始,然后创建最大的分支。该函数将跟踪到目前为止找到的最佳解决方案,如果当前的平方和差大于该解决方案的总和,则立即停止。

+0

正方形背后的想法是什么? – vdrmrt 2010-12-16 11:01:39

+0

具有线性差异,9个完美的列和10列的一列将相当于十列之一。正方形差异惩罚大大不同的列值,所以错误最终均匀分布。 – 2010-12-16 11:07:07

+0

得到它的工作,但我做了蛮力计算每个组合的平方和。它现在运行在PHP上,它不是快速点亮,但如果使用少于100个类别,它应该足够了。 – vdrmrt 2010-12-20 10:55:35