给定两个排序的数组A
和B
长度N.每个元素可以包含小于M
的自然数。确定所有组合元素A
和B
的所有可能距离。在这种情况下,如果A[i] - B[j] < 0
,则距离为M + (A[i] - B[j])
。
示例:
A = {0,2,3}
B = {1,2}
M = 5
Distances = {0,1,2,3,4}
注意:我知道O(N^2)
解决方案,但我需要比O(N^2)
和O(N x M)
更快的解决方案。
修改:数组A
,B
和Distances
包含不同的元素。
答案 0 :(得分:5)
您可以通过以下方式获得O(MlogM)复杂性解决方案。
请注意,FFT通常使用浮点数完成,因此在步骤4中,您可能希望测试输出是否大于0.5,以避免潜在的舍入噪声问题。
答案 1 :(得分:0)
我可以用优化的N * N完成。
如果将A转换为0和1数组,其中1位于A中的位置(在[0..M]范围内)。 将此数组转换为位掩码后,A数组的大小将减少为64次。
这将允许按大小为64的块插入结果。
复杂性仍然是N*N
,但工作时间将大大减少。作为作者50000提到的A和B尺寸和M的限制。
预期的操作次数为N * N / 64~ = 4 * 10 ^ 7。它将在1秒后通过
答案 2 :(得分:0)
您可以使用bitvectors来完成此任务。大比特矢量上的比特矢量操作在比特矢量的大小上是线性的,但是快速,易于实现,并且考虑到您的50k大小限制,它可以很好地工作。
初始化两个长度为M的位向量。调用这些vectA和vectAnswer。设置对应于A中元素的vectA位。保留vectAnswer全部为零。
定义一种通过k个元素旋转位向量的方法(向下旋转)。我将此称为旋转(vect,k)。
然后,对于B的每个元素b,vectAnswer = vectAnswer |旋转(vectA,B)。