最小最大连续k分区的更快算法

时间:2013-02-02 06:59:28

标签: algorithm partitioning

我正在阅读此http://www.cas.mcmaster.ca/~terlaky/4-6TD3/slides/DP/DP.pdf,并想知道是否存在解决分区问题的时间复杂度更高的解决方案。

从链接:

  

“假设给定的非负数排列S.   {s1,...,sn}和整数k。如何切割 S到k或更少的范围,   以便最大限度地减少所有范围的最大总和?“

e.g。

  

S = 1,2,3,4,5,6,7,8,9

     

k = 3

     

通过将S切入这3个范围,最大范围(8,9)的总和为17,这是最小范围。

     

1,2,3,4,5 | 6,7 | 8,9

链接中建议的算法在O(kn ^ 2)中运行并使用O(kn)空间。有更高效的算法吗?

1 个答案:

答案 0 :(得分:1)

好吧显然这是因为“偏离主题”而被关闭了!? 但它现在已经恢复,所以无论如何,我发现解决方案是二元搜索答案。对不起,我忘了其中一个限制是所有整数的总和不会超过2 ^ 64。所以让C =所有整数的累积和。然后我们可以使用

二进制搜索答案

bool isPossible(int x)

如果可以将S划分为最大分区和小于X的k个分区,则返回true。isPossible(int x)可以在O(n)中完成(通过从左到右添加所有内容,如果超过x创建一个新分区)。因此总运行时间为O(n * log(s))。