【问题标题】:Distribution of pairwise distances between many integers许多整数之间的成对距离分布
【发布时间】:2017-02-23 18:48:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: algorithm math complexity-theory


    【解决方案1】:

    您可以使用傅里叶变换在 O(NlogN) 内完成此操作。

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

    那么你要计算的是 A(d),其中 A(d) 定义为正好相隔 d 的整数对的数量。

    这可以计算为 A(d) = sum(H(x)*H(x+d) for all x)

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

    如果你使用 Python,这特别容易,你可以调用 scipy.signal.fftconvolve 来做这个操作。

    【讨论】:

    • 谢谢!阅读您的答案后确实很明显。我只是以某种方式错过了它......
    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多