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

标签 algorithm complexity-theory computation-theory

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

每个子列表都有一个与其关联的指标:其值的总和。我想最小化所有子列表中最大总和与最小总和之间的差异DIFF。这将使我能够将文本分成文本量大致相同的行

编辑

正如所建议的,它也可以最小化最大总和,因为这会导致最小化一行文本的最大长度。

示例:

给定列表 L = {2,3,4,5,6} 且 B = 2。

解:L1 = {2,3,4} 且 L2 = {5,6}。总和 (L1) = 9、总和 (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 背景,也没有太多解决此类计算机理论问题的经验。

谢谢!

最佳答案

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

答:不

考虑以下列表:{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

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

关于算法:通过最小化所有子列表之间元素总和的最大差异,将值列表分成子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38130571/

相关文章:

java - 这个 C++ 函数与等效的 java 函数有何不同?

javascript - 不断向后移动数组

regex - 正则表达式的复杂度是多少?

c# - 这个矩阵和码的复杂度是多少?

algorithm - 从有序列表中插入和删除元素的时间复杂度

c# - 交换单个链表上的节点

c - 普通 C 中 "while(true)"的正确等价物是什么?

theory - 图灵可判定和协同图灵判定之间的区别

上下文无关文法的算法

finite-automata - 非线性、明确和非确定性 CFL 的示例?