算法:通过最小化所有子列表之间元素总和的最大差异,将值列表分成子集

时间:2016-06-30 18:18:05

标签: algorithm complexity-theory computation-theory

我有一个值列表(整数),我希望将其拆分为 B 非空子列表,而不更改其初始顺序。目标是调整文本大小以使其适合定义的区域。

每个子列表都有一个与之关联的指标:其值的总和。我想尽量减少所有子列表中最大总和与最小总和之间的差异 DIFF 。这样我就可以将文本分成几乎相同文本数量的行

修改

正如所建议的那样,它也可以最大限度地减少最大总和,因为这样可以最大限度地减少文本行的最大长度。

示例:

鉴于列表L = {2,3,4,5,6}且B = 2。

解:L1 = {2,3,4},L2 = {5,6}。 Sum(L1)= 9,Sum(L2)= 11,DIFF = 2

鉴于列表L = {1,1,8,1,1,1,8,1}和B = 3

解:L1 = {1,1,8},L2 = {1,1,1},L3 = {8,1} .Sum(L1)= 10,Sum(L2)= 3,Sum(L3 )= 9且DIFF = 7

我的建议

由于我没有IT背景,我不确定如何处理这个问题。 首先,我试图找出可以将原始集合拆分为 B 子列表的组合数量。原始列表中元素的数量 N ,然后会有许多可能的拆分等于:

equation

然后我试着看看找到全局最小值的算法是什么。我想如果我遇到下面两个条件得到尊重的情况,我会达到全球最低标准。

  • 将元素从(其中一个)最大子列表移动到其邻居(其中一个)不会改善 DIFF
  • 将元素从(最小的)子列表中的一个(一个)移动到其邻居(其中一个)不会改善 DIFF

(由于子列表不能为空,从仅包含一个元素的子列表中移动元素需要更改多个子列表)

问题

提到的两个条件是否足以保证全局最小值(对于DIFF)?

您是否知道/记住解决此问题的算法?或者你有解决这个问题的建议吗?

你有任何阅读建议可以帮助我解决这类问题吗?

正如我所说,我没有It背景,对这些计算机理论问题没有多少经验。

谢谢!

1 个答案:

答案 0 :(得分:2)

问:提到的两个条件是否足以保证全局最小值(对于DIFF)?

A:否

请考虑以下列表:{6,5,2,4,3,7} with B=3

以及以下可能的解决方案:

{6} {5,2,4} {3,7};  Sums=(6,11,10),  DIFF = 11-6 = 5

最大组中的所有单元素变化会使DIFF变差,或者保持不变:

{6,5} {2,4} {3,7};  Sums=(6,11,10),  DIFF = 11-6 = 5
{6} {5,2} {4,3,7};  Sums=(6,7,14),  DIFF = 14-6 = 8
{6} {5,2,4,3} {7};  Sums=(6,14,7),  DIFF = 14-6 = 8

更好的解决方案:

{6,5} {2,4,3} {7};  Sums=(11,9,7),  DIFF = 11-7 = 5

所以你的方法只能找到局部最小值,而不是全局最小值。