我有给定的 S 点(在图表上为红色)和其他n个点(在图表上为黑色)。我想找到一个点 P ,该点与 S 的距离为1,这是距离所有黑点最远的点(在这种情况下,< strong> P ,每个点应该是最高的)。
由于 P 与 S 相距1,我们可以说y = √(1 - x^2)
。
我个人使用的剖析方法是:
Q - P = √((Qx - Sx - x)^2 + (Qy - Sy - √(1 - x^2))^2)
(重复所有n点并求和),在Java中最有效的方法是什么?可以使用哪些库?我听说有图书馆允许进行这种分析,但是听起来很复杂而且很慢,所以我一直在寻找任何数字思想,但找不到任何。
答案 0 :(得分:1)
以小增量跟随圆的路径。计算沿圆的每个点的距离总和。找到距离总和最大的位置。做完了 java.lang.Math就足够了。无需额外的库。查找三角函数。
SP段的角度为phi。您从0到2 * pi(请记住它使用弧度)。在循环中增加phi的数量。
类似的东西:
在循环结束时,您将获得phi角度的值,其中距离总和最大。然后从phi重新计算P的坐标以及SP的距离。
这可能是蛮力的方法,但是为此计算导数似乎过大了,而且太复杂了。
答案 1 :(得分:0)
首先,对于这个问题,在最坏的情况下,O(N ^ 2)似乎还不错。因为每次调用成本函数的成本为O(N)。考虑这种情况:N个黑点位于另一个圆上(R> 1,S的中心),并将这个新圆分成N个相等的弧。在这种对称情况下,我们有N个最大值。仅检查它们就需要O(N ^ 2)-计算每个点的成本函数。因此,我认为在所有情况下检查所有局部极值的算法在最坏的情况下至少将具有O(N ^ 2)。
这是我的一般情况的解决方案草图:
如果{Q_j}是黑点,让我们定义{O_j},以便每个O_j是最接近Q_j的点,它位于S周围的红色圆圈上。点{O_j}将圆圈分成n个弧。我们可以轻松地计算出每个O_j坐标。
似乎我们要优化的成本函数在每个弧内只有一个局部极值(这部分需要更准确的证明),因此我们可以通过三元搜索找到这些极值-线性运算的复杂性。我们还需要检查O_j的局部极值-线性复杂度。
总共,我们必须检查O(NlogN)点,每次检查花费O(N)。至少此方法比用小epsil检查圆上的每个点更方便。
答案 2 :(得分:0)
编辑:下面的算法无法按照注释中的说明运行。我将其保留在此处作为参考。
这可能有点天真,但是怎么样:
转角情况:如果所有黑点在原点周围都是点对称的(例如,一个点在-2,-2和一个点在2,2;那么上面的解将没有答案,因为A(平均点)等于S(原点0,0)。您可以再次检查A是否等于S,然后抛出异常。