【发布时间】:2014-03-27 01:36:05
【问题描述】:
我正在制作一个物理优化器,其中一个关键部分由以下 CS 问题解决。
给你一个随机有符号整数数组。他们的总和为零。可以创建一个保持运行总和的循环,如下所示:
int running_sum = 0;
int sum_peak = 0;
for( int i = 0; i < size_of_array; i++ )
{
running_sum += int_array[i];
sum_peak = max( sum_peak, abs( running_sum ) );
}
assert( running_sum == 0 );
任务是通过置换初始 int_array 来最小化结果 sum_peak。到目前为止,我的想法是:天真的方法需要指数级的时间来运行。我所知道的任何 NP-C 问题似乎都没有表达这个问题。我想不出任何方法可以将此问题表示为图形问题。
如果 X 是数组中的最大数(按绝对值),则 max_sum 的上限和下限分别为 N 和 N/2。
编辑:示例。
{-4, -6, 10}:将列表重新排序如下:{-6, 10, -4},因此 sum_peak 为 -6。
{1, 1, 1, 1, -4}:将列表重新排序为:{ 1, 1, -4, 1, 1 },使得 sum_peak 为 +2。
【问题讨论】:
-
"任务是最小化 max_sum。"请澄清这一点。
-
你的意思是重新排序整数吗?
-
是的。现在应该修好了。
-
您需要的解决方案有多好?这个问题通过归约到子集和是 NP 完全的,但是一个简单的贪心算法最多可以得到一个最优解的两倍。
-
要解决partition problem 的输入表示为列表
S,请使用输入S+[-sum(S)]解决此问题,并查看峰值是否为sum(S)/2。如果是,-sum(S)将这个问题的答案分成两个子集来回答分区问题。否则,分区问题的答案是“否”。这并没有给出一个算法来回答 this 问题,但我怀疑我们可以找到从这个问题到另一个 NP 完全问题的类似简单的简化。
标签: algorithm computer-science theory