给定一个数字向量v
,我可以通过使用累计和来访问该向量的各个部分的总和,即使用O(n)
的方式。
v = [1,2,3,4,5]
def sum_v(i,j):
return sum(v[i:j])
我能够做到O(1)
import itertools
v = [1,2,3,4,5]
cache = [0]+list(itertools.accumulate(v))
def sum_v(i,j):
return cache[j] - cache[i]
现在,我需要类似的东西,但是针对的是
pairwise
而不是sum_v
:def pairwise(i,j):
ret = 0
for p in range(i,j):
for q in range(p+1,j):
ret += f(v(p),v(q))
return ret
其中f
, 最好是, 一些相对任意的东西 (例如, *
或 ^
或 ...). 不过,仅适用于乘积或XOR的某些东西也不错。
PS1。我寻求的是以O
表示的速度提升,而不是通用的memoization,如functools.cache
。
PS2。这个问题是关于算法,而不是实现,因此是与语言无关的。 我只标记了python
,因为我的示例是用python编写的。
PS3。显然,可以预先计算所有的pairwise
值,因此解决方案应该是时间和空间复杂度都为o(n^2)
(最好是线性)。
f=^
) - sdsnumpy
实现了某些东西,我可以处理它。然而,问题在于O
方面的加速,而不是重写为C
。 - sds