我有四个大小为2 ^ N的数组,其中N = 25.数组的元素由我的算法生成。这些已排序但包含数字。现在我必须取array1的每个元素并选择array2,array3,array4的元素,使得它们的总和应该最小(当我说总和时我可以取a1 [k] + -a2 [j] + - a3 [m] + -a4 [T]。 我认为它类似于K Dimension合并问题。有人可以指出文献/实现/启发式做同样的事情。 问候, Allahbaksh
答案 0 :(得分:0)
第1步 对于array1 [k],在array2或array3或array4中找到一个数字,使其模数更接近于array1 [k]。
eg .
array1 = {1, 3, 67}
array2 = {-31, 7, 47}
array3 = {-1, 2, 10}
array4 = {14, 15, 66}
For array1[0] (ie. 1), the number closest to it is in array3 and its -1 as mod(-1) = 1
第2步 然后在剩余的2个阵列中,找到一对彼此更接近的数字。 (再次考虑模数)
eg .
array2 = {-31, 7, 47}
array4 = {14, 15, 66}
Closest elements are 7 and 14 with -7 + 14 = 7.
最终你从所有4个阵列得到min(a1 [k] + -a2 [j] + - a3 [m] + - a4 [t])。
答案 1 :(得分:0)
我认为这个问题可以在O(n)中解决,合并联合集中的所有数组,因此第二个值将是数组编号。迭代它并在每个迭代形式上从4个值回答,在每个步骤上计算所选数字之间的最大距离 - >最小化这个值。
初始结果数组,每个数组的编号最小。
public Integer[] findClosest(int[][] unionSet, Integer[] result) {
for (int i = 0; i < unionSet.length; i++) {
int value = unionSet[i][0];
int position = unionSet[i][1];
int currentDistance = getDistance(result);
Integer[] temp = Arrays.copyOf(result, result.length);
temp[position] = value;
int newDistance = getDistance(temp);
if (newDistance <= currentDistance) {
result = temp;
}
}
return result;
}
private int getDistance(Integer[] result) {
int max = 0;
int min = 0;
for (int i = 1; i < result.length; i++) {
if (result[i] != null) {
if (result[i] > result[max]) {
max = i;
}
if (result[min] != null && result[i] < result[min]) {
min = i;
}
}
}
return Math.abs(result[max] - result[min]);
}