位操作AdHoc变异

时间:2017-07-30 09:25:00

标签: algorithm bit-manipulation time-complexity adhoc

问题:

您将获得两个已排序数组A和B (大小可在1到10 ^ 5之间),其元素的范围为(1,10 ^ 5)即可。您还会获得一个大小为的数组C,其中A中的最高元素为B 中的最高元素,最初所有元素为0。现在,我们必须像这样更新C:

for i in A:
    for j in B:
        C[i+j] += 1

必须找出最终的C。

时间限制: 1秒(所以时间复杂度不应该是n ^ 2)

示例:

A = [2,4]
B = [1,3]
Then C would be = [0,0,1,0,2,0,1] (assuming 1th indexed)

我不确定从哪里开始。我试着想办法让我们一次可以增加超过1的C,但是找不到它。有一会儿我正在这样思考,假设A为二进制字符串:“0101”,我们用B中的元素移动它,但同样这也不是任何地方。

任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

如果您将初始数组视为直方图,则输出将作为两个输入直方图的卷积给出。

您可以使用快速傅立叶变换在O(nlogn)时间内执行此卷积。

例如,在Python中:

import scipy.signal

def hist(X):
    """Prepare a histogram of X"""
    h = [0]*(max(X)+1)
    for x in X:
        h[x] += 1
    return h

A = [2,4]
B = [1,3]
print scipy.signal.fftconvolve(hist(A),hist(B))

对于长度为10 ^ 5的数组,我的计算机只需0.05秒。