解决涉及对之间差异的算法挑战

Solving an Algorithmic Challenge involving Differences between Pairs

本文关键字:算法 挑战 之间 解决      更新时间:2023-10-16

下面是我想到的一个算法问题,它的动机是一个我无法解决的更难的问题。不幸的是,我也解决不了这个问题。

给定按递增顺序排列的n个数字(n在1到3*10^5之间,因此线性运行时间是必要的)。每个数字的范围从1到3*10^5。对于从1到3*10^5的每一个数字,用z表示,你想找出有多少对数字有z的两两差异。阅读下面的例子更清楚。

数字:1、6、9
答案:1对相差5(1,6),1对相差3(6,9),1对相差8 (1,9)

数字:1、2、3、4
答案:3对相差1(1,2,2,3,3,4),2对相差2(1,3,2,4),1对相差3(1,4)。

有没有一种数据结构可以在线性时间内解决这个问题?

这是一个O(n polylog n)时间的算法,用于计算所有z的计数(假设我们在1到n之间最多有n个数字)。

准备两个多项式p (x) = sum_{d in the list} x^d和Q(x) = sum_{d in the list} x^(n - d),使用快速乘法算法计算多项式乘积p (x) Q(x)的系数。要查找z的答案,请检查x^(n + z)的系数,即

sum_{d in the list} sum_{e in the list} [d + n - e = n + z],

其中[d + n - e = n + z] = [d - e = z]如果d - e = z为1,否则为0。