找到两个阵列的所有可能距离

时间:2015-12-15 08:50:37

标签: arrays algorithm

给定两个排序的数组AB长度N.每个元素可以包含小于M的自然数。确定所有组合元素AB的所有可能距离。在这种情况下,如果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)更快的解决方案。

修改:数组ABDistances包含不同的元素。

3 个答案:

答案 0 :(得分:5)

您可以通过以下方式获得O(MlogM)复杂性解决方案。

  1. 准备一个长度为M的数组Ax,如果我属于A,则Ax [i] = 1,否则为0
  2. 准备一个长度为M的数组Bx,其中Bx [M-1-i] = 1,如果我属于B(否则为0)
  3. 使用快速傅里叶变换将这两个序列卷积在一起
  4. 检查输出数组,非零值对应可能的距离
  5. 请注意,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)。

相关问题