Arrays 线性时间内两个离散随机变量求和的概率质量

Arrays 线性时间内两个离散随机变量求和的概率质量,arrays,algorithm,complexity-theory,probability-density,Arrays,Algorithm,Complexity Theory,Probability Density,给定两个离散随机变量,它们的(任意)概率质量函数a和b和一个自然数N,使得这两个变量都具有域[0..N](因此函数可以表示为数组),函数对应的随机变量具有给定和的概率(即P(a+B==target))可以在O(N)时间内通过将数组视为向量并使用其点积来计算,尽管其中一个输入被反转,两个输入被重新切片,以便对齐它们并消除边界错误;因此a的每个位置i与b的位置j匹配,使得i+j==target。这样的算法看起来像这样: ——与dotProduct和sum运行时相同;其他成分为O(1) 向量整数->向

给定两个离散随机变量,它们的(任意)概率质量函数
a
b
和一个自然数
N
,使得这两个变量都具有域
[0..N]
(因此函数可以表示为数组),函数对应的随机变量具有给定和的概率(即
P(a+B==target)
)可以在O(N)时间内通过将数组视为向量并使用其点积来计算,尽管其中一个输入被反转,两个输入被重新切片,以便对齐它们并消除边界错误;因此
a
的每个位置
i
b
的位置
j
匹配,使得
i+j==target
。这样的算法看起来像这样:

——与dotProduct和sum运行时相同;其他成分为O(1)
向量整数->向量整数->整数->比率整数
P a b目标|长度a/=长度b=未定义

|简而言之,你有一个变换F(称为离散傅里叶变换),它将大小为N的向量集映射到它自身,这样

F(a*b) = F(a).F(b)
其中,
*
是您刚才描述的卷积运算符,
是标准的点积

而且
F
是可逆的,因此您可以将
a*b
恢复为

a*b = F^{-1}(F(a).F(b))
现在这一切都很好,但关键点是
F
(和
F^{-1}
)可以在
O(N log(N))
时间内使用称为快速傅立叶变换(FFT)的东西进行计算。因此,由于通常的点积
可以在
O(N)
中计算,因此您可以获得用于计算两个分布的卷积的
O(N log(N))
算法


因此,我建议你查一查。

啊,我刚才看到的子操作确实有一个名字!今天我学习了什么是离散卷积。谢谢。作为遗言:我最近发现了我“应该”看到这个问题的方式:和的概率质量函数正是基于FFT的多项式乘法(其中,对于给出的第一个例子,P(a=I)是x^I上的系数)。