找到所有可能的点对之间的力总和?
Find the summation of forces between all possible pairs of points?
有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)时间,我想不出进一步减少它的方法!!
解决方案的方案:
- 按吸引力值对所有点进行排序,并从吸引力最低的点开始逐个处理。
- 对于每个点,您必须快速计算到所有先前添加的点的距离总和。这可以使用任何在线范围总和查询问题解决方案(如段树或 BIT)来完成。关键思想是,左侧的所有点实际上没有不同,它们的坐标总和足以计算到它们的距离总和。
- 对于每个新添加的点,您只需将该距离总和(在步骤 2 中获得)乘以点的吸引力值并将其添加到答案中。
我为了发明这个解决方案而做出的直观观察:
- 我们这里有两个"坏"函数(有点"离散"):
max
和模(距离)。 - 我们可以通过对点进行排序并按特定顺序处理它们来摆脱
max
。 - 如果我们分别处理左侧和右侧的点,我们可以摆脱模。
- 在所有这些变换之后,我们必须计算一些东西,经过一些简单的代数变换后,它转换为在线 RSQ 问题。
算法:
O(N 2)
是最佳的,因为您需要所有可能的对之间的实际距离。
相关文章:
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 有可能使shared_ptr协变吗
- 有可能在信号处理程序中设置promise吗
- 这 4 个 lambda 表达式之间有什么区别?
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- Tensorflow对象检测在Python和C++(OpenCV)之间有不同的结果
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 移动语义和深层/浅层复制之间有什么关系?
- 这两种C++语法之间有什么区别?
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- ( var > x) 和 ( x < var)之间有什么区别吗?
- 在 C 和 C++ 中作为函数参数,int **a 和 int a[][] 之间有什么确切的区别
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区
- windows DLL是否有可能在多个线程或进程之间使用相同的套接字编号
- 琐碎的可复制性和可能不可复制性的价值表达之间有显著差异吗
- 是否有可能得到两个图像之间的旋转和缩放只有一个冲浪描述符
- 是否有可能编写可以在HPX和c++ 1x线程之间切换的代码?