如果是非负数的序列,可以证明下述方法可以使其每个分组和的最大值最小。(准确说是,没有任何其他解比这个解更优,因为可能不止一个最优解)
首先,把每个值单独一个分组,即分为 n
组。然后求所有相邻分组的和,选择和最小的那两个分组合并,如果和相同的,可选任意两个,直到分为m
组。
比如,第一次5+2
的和最小,将其合并10,(5,2)=7,12,6,17,3,10
然后是3+10
和最小,将其合并10,(5,2)=7,12,6,17,(3,10)=13
然后是10+7
和最小,将其合并(10,5,2)=17,12,6,17,(3,10)=13
然后是12+6
和最小,将其合并(10,5,2)=17,(12,6)=18,17,(3,10)=13
然后是17+13
和最小,将其合并(10,5,2)=17,(12,6)=18,(17,3,10)=30
如果平衡性定义为,sum[a_i/s*Log(s/a_i),i]
(熵定义)其中a_i
表示这个序列(非负序列),s
为所有数的和,可以证明,下述分组方法可以达到最优的平衡性。
定义H(x,y) = x/(x+y)*Log((x+y)/x)+y/(x+y)*Log((x+y)/y)
。
首先,把每个值单独一个分组,即分为 n
组。然后分别求每个分组的和,设相邻分组的和分别为x
,y
,选择(x+y)/s*H(x,y)
最小的那两个相邻分组合并。如果相同的,可选任意两个,直到分为m
组。