首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >位操作AdHoc变异

位操作AdHoc变异
EN

Stack Overflow用户
提问于 2017-07-30 09:25:00
回答 1查看 57关注 0票数 1

问题:

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

代码语言:javascript
复制
for i in A:
    for j in B:
        C[i+j] += 1

得找出最后的C。

时间限制:1秒(因此时间复杂度不应为n^2)

示例:

代码语言:javascript
复制
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中的元素来转移它,但这也不会导致任何地方。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-30 11:31:23

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

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

例如,在Python中:

代码语言:javascript
复制
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秒。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45398320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档