【问题标题】:Efficient Algorithm to Compute The Summation of the Function计算函数总和的高效算法
【发布时间】:2015-07-21 10:50:37
【问题描述】:

给定 N(x,y) 形式的点,我们需要计算以下函数:

F(i,j) = ( | X[i] - X[j] | ) * ( | Y[i] - Y[j] | )

计算所有有序对 (i,j) 的 F(i,j) 总和

N

我正在寻找O(N log N) 解决方案。

我最初的想法是按 X 对点进行排序,然后使用 BIT,但我无法制定明确的解决方案。

【问题讨论】:

  • 看,如果所有对导致 F(i,j) 的值不同,在 O(N log N) 高度内没有办法做到这一点,请在评论中发布比赛链接.
  • 您知道i = i 的所有值都为零。你也知道对称性成立:F(i, j) = F(j, i).
  • @duffymo OP 从未说过 i=j 为 0。
  • @Dante - 错字;应该读到 i=i。由于 x[i]-x[i]=y[i]-y[i]=0
  • 你能链接到比赛问题吗?

标签: algorithm math data-structures time-complexity


【解决方案1】:

我有一个使用O(N log(M)) 时间和O(M) 内存的解决方案,其中MY 的范围大小。和你想的差不多。

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

让我们将A 写成所有对i > j 的总和i > j,这样Y[i] > Y[j],并写成B 作为所有对i > j 的相同表达式的总和,这样Y[i] < Y[j]

A + B 的总和可以在O(N) 时间内轻松计算,最终答案可以从A - B 计算。因此计算A就足够了。

现在创建一个二叉索引树,其节点由[a, b) 形式的整数索引,对于某些k,则为b = a + 2^k。 (不是一个好句子,但你知道我的意思,对吧?)根节点应该覆盖[Y_min, Y_max] 的可能值Y 的区间。

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

f(a, b, i)(X, Y) = sum of (X - X[j]) * (Y - Y[j]) for all j such that j < i and Y[j] < Y

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

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

如果您负担得起O(M) 内存,那么这应该可以正常工作。

【讨论】:

  • 也可以压缩Y坐标,得到O(N)内存和O(N log N)时间
  • 或许可以对Y 值进行预排序。
猜你喜欢
  • 1970-01-01
  • 2015-11-01
  • 2019-09-18
  • 2020-01-29
  • 2013-11-26
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多