求出所有可能的点对之间的力的总和?

时间:2017-05-13 15:56:32

标签: c++ algorithm mathematical-optimization

n个点,每个点都有两个属性:

1。位置(来自轴)

2。吸引力值(整数)

两点之间的吸引力A& B由下式给出:

Attraction_force(A, B) = (distance between them) * Max(Attraction_val_A, Attraction_val_B);

求出所有可能的点对之间所有力的总和?

我试过在所有对之间计算和增加力

for(int i=0; i<n-1; i++) {
    for(int j=i+1; j<n; j++) {
        force += abs(P[i].pos - P[j].pos) * max(P[i].attraction_val, P[j].attraction_val);
    }
}

示例:

Points            P1 P2 P3
Points distance:  2  3  4
Attraction Val:   4  5  6

Force = abs(2 - 3) * max(4, 5) + abs(2 - 4) * max(4, 6) + abs(3 - 4) * max(5, 6) = 23

但这需要 O(n ^ 2)时间,我想不出有办法进一步减少它!!

2 个答案:

答案 0 :(得分:3)

解决方案的方案:

  1. 按吸引力值对所有点进行排序并逐个处理,从吸引力最低的点开始。
  2. 对于每个点,您必须快速计算到之前添加的所有点的距离总和。这可以使用任何在线范围求和查询问题解决方案来完成,例如段树或BIT。关键的想法是左边的所有点都没有真正的不同,它们的坐标总和足以计算到它们的距离之和。
  3. 对于每个新添加的点,您只需将该距离之和(在步骤2中获得)乘以点的吸引力值,然后将其添加到答案中。
  4. 我为了发明这个解决方案而做出的直观观察:

    1. 我们有两个&#34;坏&#34;函数在这里(有些&#34;离散&#34;):max和modulo(距离)。
    2. 我们可以通过对点进行排序并按特定顺序处理它们来摆脱max
    3. 如果我们分别处理左侧和右侧的点,我们可以摆脱模数。
    4. 在完成所有这些转换后,我们必须计算一些在经过一些简单的代数转换后转换为在线RSQ问题的东西。

答案 1 :(得分:-1)

算法:

  

O(N 2

是最佳的,因为您需要所有可能对之间的实际距离。