计算两个数组的元素之间的距离

时间:2018-04-11 17:36:15

标签: algorithm data-structures

我有2个数组A[]B[]每个都有n个元素,我想计算A数组的每个元素与B数组元素之间的差异,和输出是元素的集合,差异小于x0(某个值)。

例如:A =[1,2,3] B=[2,3,4]我希望"1-2","1-3","1-4","2-3" ...

x0 = 2,所以输出为([1,2],[1,3],[2,3]...)

我使用蛮力方法,获取数组A的每个元素,并使用时间复杂度为B的{​​{1}}元素进行减法。任何人都可以提出更好的方法吗?

2 个答案:

答案 0 :(得分:0)

此问题的复杂性为output-sensitive,这意味着,如果所有可能的对匹配,则alogirhtm必须运行O(n^2)时间。假设输出小于O(n*log(n)),则以下python代码运行时为O(n*log(n))

from bisect import bisect_left, bisect_right
from itertools import repeat

arr1 = [1, 2, 3]
arr2 = sorted([2, 3, 4, 5])

d = 1

result = []
for item in arr1:
    left, right = bisect_left(arr2, item - d), bisect_right(arr2, item + d)
    result += zip(repeat(item), arr2[left:right])

上面的代码对其中一个数组进行排序,然后从已排序的数据中搜索另一个项目。这需要O(n*log(n))时间来排序其中一个数组,然后O(log(n))用于为每次搜索平分数组。

答案 1 :(得分:0)

查找对:(Ai, Bi) where Ai - Bi < X0,

现在,

   Ai - Bi < X0,
=> Ai - X0 < Bi

这意味着B中值大于(Ai - X0)的任何元素都会导致Ai - Bi < X0

基本上,你必须在B中搜索大于其他值的元素,比如说P

您可以在O(lgN)时间轻松搜索已排序数组中的元素。在这种情况下,您需要修改二进制搜索,找到大于给定值的索引值。

以下是如何实现这一目标:(Click Here)

以下是完整的算法:

getPairs(A,B,X0)
    sort(B)
    pairs = []
    for each element Ai in A do:
        P = Ai - X0
        index = modifiedBinarySearch(B, P)
        while ( index < B.length ) do
            pairs.push( { Ai, Bindex } )
            index++
        done
    done
    return pairs
done

时间复杂度:

Sorting array of N elements:        O(NlgN)
Iterating over array of N elements: O(N)
The inner while loop:               O(N)

Thus, overall complexity:           O(NlgN)

如果您不确定while循环的内在程度,O(N),请在评论中告诉我。

相关问题