bes*_*tin 8 java arrays algorithm
我有一个1到n的数组,每个包含m个元素.我有另一个对称的n X n矩阵b,它包含阵列之间的距离.我想从每个数组x 1到x n中选择一个元素,限制为以下约束.(一个1是一个数组,并且x 1从拍摄的单个值1)
一个例子
a1 = [1, 2, 3, 8, -1, -1, 0, -1]
a2 = [1, 2, 4, 0, -1, 1, 10, 11]
b = |0, 2|
|2, 0|
Run Code Online (Sandbox Code Playgroud)
选择的值是x 1 = 8和x 2 = 4.可以注意到我们没有从第二个中选择10或11,因为它们中任何一个的最近可能值都只是0.
现在,当我只有两个数组时,我可以在O(n 2)时间内在java中执行以下操作,我想,并找到最大总和,在这种情况下为12.如何为超过2个阵列实现更好的解决方案?
int[][] a = new int[][]{{1, 2, 3, 8, -1, -1, 1, -1}, {1, 2, 4, 0, -1, 1, 10, 11}};
int[][] b = new int[][]{{0, 2}, {2, 0}};
int maxVal = Integer.MIN_VALUE;
for (int i = 0; i < a[0].length; i++) {
for (int j = Math.max(i - b[0][1], 0); j < Math.min(a[1].length, i + b[0][1]); j++) {
maxVal = Math.max(maxVal, a[0][i] + a[1][j]);
}
}
System.out.println("The max val: "+maxVal);
Run Code Online (Sandbox Code Playgroud)
这里不能使用动态规划,因为不存在最佳子结构:b_1n 条目可能会破坏从 x_1 到 x_{n-1} 的非常有价值的路径。因此,一般来说,可能很难避免指数时间。然而,对于一组确实合理限制选择的 b_ij ,有一个简单的回溯方法应该具有合理的性能:
识别最受约束的数组对于性能至关重要:它构成了一种模糊置信传播的形式,可以有效地修剪与先前选择所需的当前选择不兼容的未来选择。根据您期望的输入类型,根据可实现的分数进行进一步的优先级划分/修剪可能是有价值的。
我的 35 行 Python 实现在给定一个由小整数组成的 10x10 随机矩阵和 b_ij 为常数 2 的情况下运行了几秒钟。b_ij=3(每对数组最多允许 10 个值中的 7 个!)大约需要一分钟。