【问题标题】:Finding a partitioning such that the difference between max of sum of partitions and that of min is minimized找到一个分区,使得分区总和的最大值与最小值之间的差异最小化
【发布时间】:2021-08-15 18:35:15
【问题描述】:

我正在解决算法研究的实践问题,并为以下问题寻找最快的实现。

给定一个长度为N的正一位整数列表L,在L中定义三个点ABC,以便列表分为三个分区。请注意,A < B < C 在索引方面。第一个分区是AB之间的所有元素,第二个分区是BC之间的所有元素,第三个分区是所有其他元素。

然后让hij成为每个分区的总和。我想在所有可能的分区中找到max([h, i, j]) - min([h, i, j]) 的最小值。

例如,如果L = [4, 5, 6, 7, 6, 5, 4],那么分份将是

a = [6, 7]
b = [6, 5]
c = [4, 5, 4] # reminder 

# because
h = sum(a) -> 13
i = sum(b) -> 11
j = sum(c) -> 13

# that minimize the difference
max([h, i, j]) - min([h, i, j]) -> 2

我目前想出的唯一方法是暴力破解所有可能的分区,以便

current_min = sum(L)
N = len(L)

for A in range(N):
    for B in range(A, N):
        for C in range(B, N):
            sum_1 = sum(L[A:B])
            sum_2 = sum(L[B:C])
            sum_3 = sum(L[:A]) + sum(L[C:])
            sums = [sum_1, sum_2, sum_3]
            if max(sums) - min(sums) < current_min:
                current_min = max(sums) - min(sums)

但我可以看到我的解决方案并不理想。有没有更快的方法?

【问题讨论】:

  • 不,这是一个类似的问题,但在我的问题中,目标是最小化最小部分之和与最大分区之和之间的差异。因此最小化的最大值是不够的,还需要最大化最小分区的和的最小值。实际上,该问题的第一个测试用例中的答案是 {2, 1}, {5, 1}, {2, 2, 2} 这不是我问题的答案,应该是 {2, 2, 1}、{5、1}、{2、2}。

标签: python algorithm


【解决方案1】:

这是一种方法,您可以计算总和。计算总和的 1/3。现在遍历列表并继续将元素添加到 sum1 直到它刚刚超过总和的 1/3(检查是否至少保留 2 个元素)。这使得 1 个分区。现在类似地,继续将元素添加到 sum2 直到它刚好超过总和的 1/3。其余元素构成分区 3。

现在你可以以相反的顺序重复这个过程,看看哪一组 max([h, i, j]) - min([h, i, j]) 给出最小值。

这个想法是保持分区总和之间的差异尽可能小。这将自动确保总和的最大值和最小值之间的差异最小。

【讨论】:

  • 如果我误解了您的想法,我很抱歉,但它是否适用于问题中的测试用例?因为第一个分区并不总是从列表的左端或右端开始,所以您需要找到第一个分区的开始位置,例如对于列表 [a, b, c, d, e, f],分区可能是 [b,c] [c,d] 和 [a,f](第一个分区的开头是 a)。所以你不能只是从a开始添加到f。
  • 对不起,我以为我们必须从第一个元素开始分区
猜你喜欢
  • 2021-04-07
  • 1970-01-01
  • 2017-02-02
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 2020-04-30
相关资源
最近更新 更多