将数组拆分为四个框,以使框的XOR之和最大

时间:2019-10-07 15:31:42

标签: algorithm recursion dynamic-programming

  

给出一个整数数组,需要将其拆分为四个整数   使得XOR的总和最大。

     

I / P-[1,2,1,2,1,2]

     

O / P-9

     

说明:Box1-[1,2]                Box2-[1,2]                方格3-[1,2]                Box4-[]

     

我尝试使用递归,但由于   时间复杂度是指数级的。我期待使用动态的解决方案   编程。

def max_Xor(b1,b2,b3,b4,A,index,size):
    if index == size:
        return b1+b2+b3+b4  
    m=max(max_Xor(b1^A[index],b2,b3,b4,A,index+1,size),
        max_Xor(b1,b2^A[index],b3,b4,A,index+1,size),
        max_Xor(b1,b2,b3^A[index],b4,A,index+1,size),
        max_Xor(b1,b2,b3,b4^A[index],A,index+1,size))
return m
def main():
    print(max_Xor(0,0,0,0,A,0,len(A)))

预先感谢!

3 个答案:

答案 0 :(得分:2)

有几件事可以加快算法的速度:

  1. 建立一些启动逻辑:在第1栏和第2栏没有区别之前,将任何东西放入第3栏都没有意义。实际上,通常应该具有一个优先顺序,以防止您以不同的顺序重复配置。
  2. 记住你的逻辑;这样可以避免重复计算。
  3. 在大多数情况下,请利用存在的价值代数。

最后一项可能是最大的节省。例如,如果最长的数字包括几个5位和4位数字,那么在您将这些数字适当地放入框中之前,考虑短的数字是没有意义的,从而获得前导比特的最大优势。仅用四个框,您不能从3位数字中得到一个数字,该数字控制着一个错位的5位数字。

您的目标是将奇数个5位数字放入3个或全部4个盒子中;与此相对,仅检查此值是否“模拟”了剩余数字的第4位。例如,给定六个5位数字(范围为16-31)和少量的小数字(0-7),您的首要考虑是仅处理将5位数字除以(3、1、1, 1),因为这会使每组中有价值的5位打开。

在输入中混合使用更均匀的值时,您还需要考虑如何为类似的“保持奇数”启发式分布4位。请注意,当您从大到小工作时,您只需要担心保持奇数并观看接下来的内容即可。

这些技术应可使您修剪递归以及时完成。

答案 1 :(得分:0)

我们可以在此处使用动态编程将问题分解为较小的集合,然后将其结果存储在表中。然后使用已存储的结果来计算更大集合的答案。 例如:

Input -- [1,2,1,2,1,2]

我们需要将数组连续分成4个方框,以使所有方框的XOR之和最大。 让我们以您的测试用例,将问题分解为较小的集合,然后开始求解较小的集合。

box = 1, num =  [1,2,1,2,1,2]
ans = 1 3 2 0 1 3

由于我们只有一个框,所以所有数字都将放入该框。我们将把这个答案存储在一个表中。让我们将矩阵称为DP。

DP[1] = [1 3 2 0 1 3] 
DP[i][j] stores answer for distributing 0-j numbers to i boxes.

现在让我们假设有两个盒子,我们将一个接一个地取数字。

num = [1] since we only have one number it will go into the first box.
DP[1][0] = 1

让我们添加另一个号码。

num = [1 2]

现在有两种方法可以将新号码输入框中。

case 1: 2 will go to the First box. Since we already have answer 
for both numbers in one box. we will just use that.

answer = DP[0][1] + 0 (Second box is empty)

case 2: 2 will go to second box.
answer = DP[0][0] + 2 (only 2 is present in the second box)

这两种情况的最大值将存储在DP [1] [1]中。

DP[1][1] = max(3+0, 1+2) = 3.

现在num = [1 2 1]。 同样,对于新数字,我们有三种情况。

box1 = [1 2 1], box2 = [], DP[0][2] + 0
box1 = [1 2], box2 = [1], DP[0][1] + 1
box1 = [1 ], box2 = [2 1], DP[0][0] + 2^1

这三个数中的最大值将作为DP [1] [2]的答案。

类似地,我们可以找到num = [1 2 1 2 1 2] box = 4的答案

1 3 2 0 1 3 
1 3 4 6 5 3 
1 3 4 6 7 9 
1 3 4 6 7 9 

还要注意a xor b xor a = b。您可以使用此属性按注释中的建议在恒定时间内获取数组段的异或。 这样,您可以将问题分解成较小的子集,并使用较小的集合答案来计算较大的答案。希望这可以帮助。理解了这一概念之后,您可以比指数更快地实施它。

答案 2 :(得分:0)

我会从最高位到最低位一点一点地走。对于每一位,请尝试分配已设置该位的仍未使用的数字的所有组合,以使每个框中都有奇数个数字,其他都没有关系。选择总体最佳路径。使这种贪婪方法复杂化的一个问题是,设置了较低位的两个框可以等于设置了下一个较高位的框。

或者,将递归中的框状态记为有序元组。