我有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}}元素进行减法。任何人都可以提出更好的方法吗?
答案 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),请在评论中告诉我。