吸引力作为编码

时间:2016-12-18 06:40:05

标签: arrays algorithm data-structures time-complexity

$('#datepicker').change(function(){ $.ajax({ type: "POST", url: "datecalc.php", data: {text:$(this).val()} }); }); 轴上存在N个粒子,其中每个粒子都有两个与之关联的属性,即粒子的位置及其吸引力值

两个粒子Xi之间的吸引力定义为:

吸引力 - 力(i,j)=距离(i,j)×MAX(Attraction_Value [i],Attraction_Value [j])

由于它们都是直线,任何2之间的距离 粒子等于它们位置之间的绝对差值。

您应该计算以下内容:

j表示

求和(i,N-1)求和(j = i + 1,N)(力的吸引力(i,j))

约束

∑N−1i=1∑Nj=i+1(Attraction−Force(i,j))

1≤N≤2×10^5

1≤Attraction−Value≤10^4

示例输入

1≤Position≤10^4

示例输出

3
1 2
2 4
3 6

我在22 尝试了以下

O(n^2)

如果有任何其他优化方法可以解决此问题,请告诉我。

任何想法都将受到赞赏

先谢谢

2 个答案:

答案 0 :(得分:3)

我认为有一个O(n log(n))算法。首先是我的注释:我们想要计算

S = Sum[i] Sum[j>i] abs(x[i] - x[j]) max(m[i], m[j])

在此总和中,每个(无序)对{i, j}只出现一次,在对粒子进行排序时,我们可以假设位置x[i]按升序排列。通过对质量m[i]进行排序,我们可以得到一个数组r[1], ..., r[n],使m[r[i]]按升序排列。

我的想法是根据它们的位置构建一个包含粒子的平衡二叉搜索树,这样在每个子树T的根处,一个存储子树粒子的数量和子树粒子位置的总和。 / p>

使用此数据,对于任何实数x,可以在时间O(log(n))中确定Sum[i] abs(x - x[i])

现在采用排名r[n]的最重的粒子,它的贡献 总和Sm[r[n]] Sum[i] abs(x[r[n]] - x[i])。可以按时间0(log(n))计算此贡献。然后,我们可以通过在平衡树上使用标准算法,或者更简单地通过修改节点上包含的数据,从二叉树中删除最重的粒子。

通过一个接一个地感应最重的粒子,我们及时获得S的总和O(n log(n))

答案 1 :(得分:0)

O(nlogn)近似算法,如 Barnes-Hut模拟粒子网格方法。但是你必须在输出的准确性上妥协。我认为答案的准确性对你的情况非常重要。

了解更多信息:

  1. Similar question
  2. Wiki
相关问题