Algorithm 计算函数和的有效算法

Algorithm 计算函数和的有效算法,algorithm,math,data-structures,time-complexity,Algorithm,Math,Data Structures,Time Complexity,我们得到了形式为(x,y)的N点,我们需要计算以下函数: F(i,j)=(|X[i]-X[j]|)*(|Y[i]-Y[j]|) 计算所有有序对(i,j)的F(i,j)之和 N我有一个使用O(N log(M))时间和O(M)内存的解决方案,其中M是Y范围的大小。这和你的想法很相似 首先对点进行排序,使X坐标增加 让我们为所有对写A(X[i]-X[j])*(Y[i]-Y[j]),这样Y[i]>Y[j],为所有对写i>j的相同表达式的和写B,这样Y[i]

我们得到了形式为(x,y)N点,我们需要计算以下函数:

F(i,j)=(|X[i]-X[j]|)*(|Y[i]-Y[j]|) 计算所有有序对(i,j)的F(i,j)之和
N我有一个使用
O(N log(M))
时间和
O(M)
内存的解决方案,其中
M
Y
范围的大小。这和你的想法很相似

首先对点进行排序,使
X
坐标增加

让我们为所有对写
A
(X[i]-X[j])*(Y[i]-Y[j]),这样
Y[i]>Y[j]
,为所有对写
i>j
的相同表达式的和写
B
,这样
Y[i]

可以在
O(N)
时间内轻松计算A+B之和
A+B
,并且可以从
A-B
计算最终答案。因此,只需计算
A

现在创建一个二元索引树,它的节点通过
[a,b)
形式的整数进行索引,其中
b=a+2^k
对于一些
k
(不是一个好的句子,但你知道我的意思,对吧?)根节点应该覆盖
Y
的可能值的整数
[Y_min,Y_max]

对于由
[a,b)
索引的任何节点,以及对于任何
i
,让
f(a,b,i)
为以下多项式:

f(a,b,i)(X,Y)=所有j的(X-X[j])*(Y-Y[j])之和,使得j

它的形式是
p*XY+Q*X+R*Y+S
,因此这样的多项式可以用四个数字
p,Q,R,S
表示

现在从
i=0
开始,你可以计算
f(a,b,i)(X[i],Y[i])
。从
i
i+1
,你只需要更新那些
[a,b)
包含
Y[i]
的整数。当你到达
i=N
时,就会计算
a
的值


如果你能负担得起
O(M)
内存,那么这应该很好。

看,如果所有对导致F(i,j)的值不同,那么在O(N log N)高度没有办法做到这一点,请在评论中发布链接到竞赛。你知道
i=i
的所有值都是零。你也知道对称性适用:
F(i,j)=F(j,i)
@duffymo OP从来没有说过任何关于i=j是0的事情。@Dante-Typo;应该读i=i。既然x[i]-x[i]=y[i]-y[i]=0你可以链接到竞赛问题吗?你也可以压缩y坐标,得到O(N)内存和O(N log N)时间。也许,你可以对
y
值进行预排序。