解决涉及对之间差异的算法挑战
Solving an Algorithmic Challenge involving Differences between Pairs
下面是我想到的一个算法问题,它的动机是一个我无法解决的更难的问题。不幸的是,我也解决不了这个问题。
给定按递增顺序排列的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。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- 算法输出正确答案,但编程挑战给了我错误的答案
- 将一维矩阵数组转换为主一维矩阵的有趣算法挑战,需要有效的解决方案
- 解决涉及对之间差异的算法挑战