我接受了以下练习:
给定多项式 P 和实数序列 x 1 ,..., x n ,找到可以计算表格 S(i,j)= P(0)x i + P(1)的表达式的数据结构 D )x i + 1 + ... + P(j - i - 1)x j - 1 在恒定时间内对 x 1 ,..., x n 。
我一直试图解决它已经有一段时间了,并没有取得多大成功。一个明显的解决方案需要 O(n 2 )预处理时间:对于 1 ... n 中的每个 j ,我可以计算 P(j)= a 0 + ja 1 + j 2 a 2 + ...... + j m O(mn)时间内的 m 。然后我可以计算任何 S(i,j)的前缀和,其中 j&gt;我在每个不同的 i 的 O(n)时间内,因此在 O(n 2 )他们完全是时间。 (我只是为每个可能的 i 分别采用常规前缀和。)如果可能的话,我想(渐近地)比这更快(<渐远)。
问题似乎是 S(i,j)的计算没有产生关于 S(i + 1,j)的有用信息。看: S(i,j)= P(0)x 1 + P(1)x 2 + ... ,但< em> S(i + 1,j)= P(0)x 2 + P(1)x 3 。看到? P 已向右移动。如果有办法从 S(i,j)计算 S(i + 1,j),我相信我可以继续 O(mn) 时间。
我试过了:
计算 x 1 ,..., x n 的(常规)前缀和并操纵表达式,以便常规前缀和可用于计算 S(i,j)但没有成功。
写出 S(i,j)的显式公式,并按多项式系数对这些项进行分组( a i 而不是 x i 。问题依然存在。
如果你能做得更快,请给我一个提示如何继续。 请不要提供明确的解决方案,我想自己弄清楚。
P.S。:实际上有一个提示可以解决这个问题:“通用前缀和。”
答案 0 :(得分:0)
您可以使用O(nm+m^2)
预处理和内存以及O(m)
查询时间来执行此操作。如果您的m
有限,那基本上就是您要求的运行时间。
由于您要求不提供过于直接的提示,如果您使用简单多项式P(x) = x
,我将向您展示如何解决您的任务。
定义(并及时预先计算O(nm)
:
Q0(j) = Sum_{0<=k<j} x_k
Q1(j) = Sum_{0<=k<j} k*x_k
然后我们有:
S(i,j) = Sum_{i<=k<j} (k-i)*x_k
= Sum_{i<=k<j} k*x_k - i*Sum_{i<=k<j} x_k
= Q1(j)-Q1(i) - i*(Q0(j)-Q0(i))
用于持续时间查询。
通过一些求和操作,对于一般多项式,上述概括每次查询需要O(m^2)
次。但是,通过额外的O(nm+m^2)
预处理,您可以获得O(m)
个查询时间。我猜想这对于n
中的线性内存使用是最佳的。