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

时间:2014-08-18 13:41:47

标签: c++ algorithm data-structures

下面是我提出的一个算法问题,由一个我无法解决的难题所激发。不幸的是,我也无法解决这个问题。

按递增顺序给出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)

是否有可用于在线性时间内解决此问题的数据结构?

1 个答案:

答案 0 :(得分:4)

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

准备两个多项式P(x)= sum_ {d列表} x ^ d和Q(x)= sum_ {d列表} 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。