【问题标题】:Match Three or More Nearest Numbers from arrays匹配数组中三个或更多最近的数字
【发布时间】:2012-04-17 20:30:46
【问题描述】:

我有四个大小为 2^N 的数组,其中 N = 25。数组的元素是由我的算法生成的。这些已排序但包含数字。现在我必须取 array1 的每个元素并选择 array2、array3、array4 的元素,使得它们的总和应该是最小的(当我说 sum 时,我可以取 a1[k] +-a2[j]+-a3[m] +-a4[t]。 我认为它类似于 K Dimension 合并问题。有人可以指出文献/实施/启发式做同样的事情。 问候, 阿拉巴克什

【问题讨论】:

  • 1.一个例子会很有帮助。 2. 你可以使用±号。
  • 您用文字提出的问题是微不足道的-从array2、3和4中取最小的元素,而不管array1的元素是什么,那么总和也将是最小的。但我怀疑你想知道一些不同的东西。

标签: algorithm matching minimum


【解决方案1】:

第 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])。

【讨论】:

  • 所以对于 array1 中的 1,这给出:1 - 1 - 7 + 14 = 7?但你可以做得更好:1 + 7 + 10 - 14 = 4。
  • 这将使解决方案呈指数级增长。我认为这样做的蛮力方法是将其放入 for 循环中。因此,四个数组的 4 个 for 循环将随着 N 的增加而消耗巨大的计算能力。是否有任何 KDM 合并的启发式算法。
  • 实际上最近的是 3,7,10,14 -> 距离是 11
【解决方案2】:

我认为这个问题可以在 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]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2014-03-24
    • 2021-03-05
    相关资源
    最近更新 更多