许多整数之间成对距离的分布

时间:2017-02-23 18:48:15

标签: algorithm math complexity-theory

我们在1和N之间有M个唯一的整数。在现实生活中,N是几百万,M在N / 10和N / 3之间。我需要计算M个整数之间成对距离的分布。

问题的强力复杂性是M ^ 2,但输出只是N个数字。所以自然的问题是是否有更快的算法。即使是与N * sqrt(M)一样快的算法也足以满足我们的目的。

问题出现在以下问题的子集中。我们有一个大的虚拟方形对称矩阵,几百万到几百万个元素。矩阵的某些行和列被屏蔽掉。我们需要找到矩阵的每个对角线中有多少掩蔽元素。人们可以很容易地计算出每个对角线有多少蒙蔽的箱子。但是,通常屏蔽的行和列将在对角线上相交,因此仅屏蔽一个箱。为了避免重复计算这些,我们需要成对分配屏蔽列之间的距离。

1 个答案:

答案 0 :(得分:3)

您可以使用傅里叶变换在O(NlogN)中执行此操作。

这个想法是你首先计算M个整数的直方图H(x),其中H(x)是值x在输入中出现的次数(如果所有M都是不同的,则为0或1) - 但这不是必要的。)

然后你要计算的是A(d),其中A(d)被定义为完全相隔的整数对的数量。

这可以计算为A(d)=总和(H(x)* H(x + d)对于所有x)

这种类型的函数称为卷积,可以通过傅里叶变换,输出自身相乘,然后计算逆变换来有效地计算。需要注意适当填充,例如见question

如果你使用Python,这很容易,因为你可以调用scipy.signal.fftconvolve来执行此操作。