【问题标题】:Calculating distance between element of two arrays计算两个数组元素之间的距离
【发布时间】:2018-09-21 16:58:34
【问题描述】:

我有 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 的时间复杂度为O(n^2) 的元素。任何人都可以提出更好的方法吗?

【问题讨论】:

    标签: algorithm data-structures


    【解决方案1】:

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

    现在,

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

    这意味着B 中任何大于(Ai - X0) 的元素都会导致Ai - Bi &lt; 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),请在 cmets 中告诉我。

    【讨论】:

      【解决方案2】:

      这个问题的复杂性是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)) 来为每次搜索平分数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-25
        • 2021-01-20
        • 2014-11-16
        • 1970-01-01
        • 2021-05-15
        相关资源
        最近更新 更多