来自数组的表达式

时间:2012-11-16 17:17:35

标签: algorithm math data-structures np np-hard

你有三件事

1)'n'正和负整数数组。 2)数字'x'。 3)运算符:'+',' - ','%','/'

使用数组形成表达式,以便在计算时,结果变为“x”。

例如,考虑数组[5,3,-1,6,2,3]和x = 2,一种可能的解决方案是

5/3 +( - 1)+ 6/2 - 1

假设5/3的结果为1(始终为整数除法)。

我有一个更复杂的变种。

在此问题的复杂变体中,假设BODMASS规则不适用。所以,在任何时候你遍历元素'm'并且你有中间结果'y'。您可以将任何运算符应用于'y'和[m + 1]。

例如,在变体1中,

5 + 3 - 2/2 = 7(首先评估2/2,所以5 + 3 - 1)

在变体2中,

5 + 3 - 2/2 = 3(5 + 3 = 8.阵列减少到8-2 / 2。现在,8 -2 = 6.并且阵列减少到6/2,评估为3)。

Algo / Math / DS专家?

这是NP难吗?

2 个答案:

答案 0 :(得分:2)

有4个运算符,因此对于一组n个项,您有4 ^(n-1)个可能的值。您可以构建搜索空间的图形,其中每个路径表示一组运算符值,结束点是计算结果。

在所有这些终点中,只有那些给出正确答案的终点才会在正确的终点结束。

但请注意,如果从终点开始,则可以向后移动;只有拥有一组有效的运算符才会以第一个值结束。

所以从两端遍历它,两个计算将在中间相遇。这是一个小得多的空间,每个方向的空间为4 ^(n / 2)= 2 ^ n。要匹配这两组答案,您需要对中间列表进行排序,尽管您可能希望在每一步都执行此操作,以防止出现重复路径。在这一点上,它看起来很像一个迷宫遍历。

一个已知的NP完全问题是Boolean satisfiability的问题,这是“确定给定布尔公式的变量是否可以以使公式求值为TRUE的方式分配的问题”。我怀疑,因为搜索空间明显大于布尔可满足性问题,并且由于解决方案也会确定公式是可满足的(因此至少与解决可满足性一样难),那么问题应该是是NP完全的。

在迷宫意义上,其值偏离零的部分解决方案不太可能是正确的解决方案,并且给定参数的初始扫描,应该清楚大小的限制(即所有乘法),在布尔问题中并非如此。

编辑:澄清我在开头提到的树。假设我们的列表是

 1 ? 2 ? 5 = X

然后图表是这样的:

 r1 -->  r2  ---> r3 (X)

 1  +2    3  +5    8
             -5   -2
             *5   15
             /5    0

    -2   -1  +5    4
             -5   -6
             *5   -5
             /5    0

    *2    2  +5    7
             -5   -3
             *5   10
             /5    0

    /2    0  +5    5
             -5   -5
             *5    0
             /5    0

如您所见,如果X为-5,那么它可以是1 -2 * 5或1/2 -5。向后工作,从-5:

-5 +5    0
   -5  -10
   *5  -25
   /5   -1

因此,如果我们从每一端走过,我们将处于中间列,唯一的常见值将是-1和0,产生两个路径,其中8个计算而不是16个仅在一个方向上进行。< / p>

我提到的一个点,就是整数除法不是1:1的映射,所以后退是不明确的; -4/5 - &gt; 0,-3 / 5 - &gt; 0等至4/5 - &gt; 0是最坏的情况,因为它从0的任一侧接近,但即使是20/10到29/10也都映射到相同的值,2。这是一个很大的障碍;当向后踩到被分割的数字的大小时,它会增加可能的节点数,因此对于5,有3 + 5 = 8个可能的状态而不是4。

答案 1 :(得分:0)

这是尝试递归解决方案(对于简单版本):

Gen {'x'} = {'x'}
Gen {'x', 'y'} = {'x + y', 'x - y', 'y - x', 'x / y', 'y / x', 'x % y', 'y % x'}
S0 = {a[0]}
Gen S(i + 1) = {j ∈ S(i) | Gen {j, a[i + 1]}}

最终答案是:∃ j ∈ S(n). x = [[ j ]]

也就是说,我们逐步构建所有可能的(作为表达式),然后最终评估所有这些值以查看其中一个是否可以生成x(评估可以逐步进行)同样)。

但是,在这里我假设构建表达式时a的值是线性使用的。我意识到你的问题不是这样......