数组中两个数字之间的最小绝对差值

时间:2011-03-13 15:51:26

标签: arrays algorithm

给定两个数组A和B,我想找到A中的数字和B中的数字,这样两个数字之间的绝对差值就越小。

例如

A = 1 2 9
B=  4 5  6

Ans:2,4作为Math.abs(2-4)= 2

5 个答案:

答案 0 :(得分:7)

对两个数组进行排序,然后并行迭代:对于A中的每个项目,通过线性搜索搜索B中最近的项目。在B开始线性搜索,停在前一项A的位置。永远记住到目前为止发现的最小距离。

时间复杂度为O(m log m + n log n)用于排序,O(m + n)用于最终搜索,其中m和n分别是A和{{1}的长度}。

答案 1 :(得分:5)

可以在O(nlogm + mlogm)= O(nlogm)中完成:
(m是最小的阵列长度) 假设B是较小的数组

sort array B
minimum =  | A[0]-B[0] | 
for each a in A:
binary search for a in B - return the closest numbers let the numbers be b1,b2 (*)
if min{|b1-a|,|b2-a|} is smaller then the previous minimum - store it as the new minimum


(*)二进制搜索在您最接近该号码时停止(或者如果存在则找到它)
首先检查哪个较小(A或B)将确保更好的性能.-

答案 2 :(得分:0)

检查一下,也许它会给你一个想法,以便你根据自己的需要进行调整:

#define TOP 2147483647
#define true 1
#define false 0


/* finds the minimum (absolute value) of vector vec */

void Vector_Min_Not_0(vector *vec, int *min, int *index)
{
  int m, size, i, ind, aux;

  size = vec->size;
  m = TOP;
  ind = -1;
  for (i = 0; i < size; i++)
    if (vec->p[i] != 0)
      if (m > (aux = abs(vec->p[i]))) {
    ind = i;
    m = aux;
      }
  if (ind == -1)
    *min = 1;
  else
    *min = m;
  *index = ind;
} 

你会打电话给它,有一个结构:

typedef struct vector {
  int size;
  int *p;
} vector;

vector vec_A;
int min, index, *p;
Vector_Min_Not_0(&vec_A, &min, &index);

答案 3 :(得分:0)

我假设数组中的数字是浮点数。在Ruby中:

def smaller_abs(array1, array2)
  array1.product(array2).each_with_index do |ar,i|
      if i==0
        dif = (ar[0]-ar[1]).abs
        pair = ar
        next
      end
      pair = (ar[0]-ar[1]).abs > dif ? pair : ar
  end
  pair
end

我不是算法大师,但必须工作(尚未检查)。希望我帮忙!

答案 4 :(得分:0)

  1. 对两个数组进行排序
  2. 使用某些标记合并这两个数字以区分它们。 例如A = 1 9 2 B = 5 4 6
  3. 排序后:

    A = 1 2 9 B = 4 5 6

    组合阵列:C = 1a 2a 4b 5b 6b 9a

    现在进行线性搜索,找出不同标签的连续术语之间的差异。 答案:2a 4b。