gpt4 book ai didi

java - 如何使两点算法之间的最短路径更快?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:41 28 4
gpt4 key购买 nike

我写了这个算法。它有效(至少对于我的简短测试用例),但在较大的输入上花费的时间太长。我怎样才能让它更快?

// Returns an array of length 2 with the two closest points to each other from the
// original array of points "arr"
private static Point2D[] getClosestPair(Point2D[] arr)
{

int n = arr.length;

float min = 1.0f;
float dist = 0.0f;
Point2D[] ret = new Point2D[2];

// If array only has 2 points, return array
if (n == 2) return arr;

// Algorithm says to brute force at 3 or lower array items
if (n <= 3)
{
for (int i = 0; i < arr.length; i++)
{
for (int j = 0; j < arr.length; j++)
{
// If points are identical but the point is not looking
// at itself, return because shortest distance is 0 then
if (i != j && arr[i].equals(arr[j]))
{
ret[0] = arr[i];
ret[1] = arr[j];
return ret;
}
// If points are not the same and current min is larger than
// current stored distance
else if (i != j && dist < min)
{
dist = distanceSq(arr[i], arr[j]);
ret[0] = arr[i];
ret[1] = arr[j];
min = dist;
}
}
}

return ret;
}

int halfN = n/2;

// Left hand side
Point2D[] LHS = Arrays.copyOfRange(arr, 0, halfN);
// Right hand side
Point2D[] RHS = Arrays.copyOfRange(arr, halfN, n);

// Result of left recursion
Point2D[] LRes = getClosestPair(LHS);
// Result of right recursion
Point2D[] RRes = getClosestPair(RHS);

float LDist = distanceSq(LRes[0], LRes[1]);
float RDist = distanceSq(RRes[0], RRes[1]);

// Calculate minimum of both recursive results
if (LDist > RDist)
{
min = RDist;
ret[0] = RRes[0];
ret[1] = RRes[1];
}
else
{
min = LDist;
ret[0] = LRes[0];
ret[1] = LRes[1];
}


for (Point2D q : LHS)
{
// If q is close to the median line
if ((halfN - q.getX()) < min)
{
for (Point2D p : RHS)
{
// If p is close to q
if ((p.getX() - q.getX()) < min)
{
dist = distanceSq(q, p);
if (!q.equals(p) && dist < min)
{
min = dist;
ret[0] = q;
ret[1] = p;
}

}

}
}
}

return ret;
}

private static float distanceSq(Point2D p1, Point2D p2)
{
return (float)Math.pow((p1.getX() - p2.getX()) + (p1.getY() - p2.getY()), 2);
}

我大致遵循此处解释的算法:http://www.cs.mcgill.ca/~cs251/ClosestPair/ClosestPairDQ.html

这里还有一个带有伪代码的不同资源:

http://i.imgur.com/XYDTfBl.png

我无法更改函数的返回类型,也无法添加任何新参数。

感谢您的帮助!

最佳答案

您可以做几件事。

首先,您可以非常简单地缩短程序运行时间,方法是将第二次迭代更改为仅在“提醒”点上运行。这有助于您避免为每个值同时计算 (i,j)(j,i)。为此,只需更改:

for (int j = 0; j < arr.length; j++)

for (int j = i+1; j < arr.length; j++)

虽然这仍然是 O(n^2)

您可以通过迭代点并将每个点存储在智能数据结构中(最有可能是 kd-tree)来实现 O(nlogn) 时间。在每次插入之前,找到已经存储在 DS 中的最近点(kd 树在 O(logn) 时间内支持此操作),它是您的最小距离候选。

关于java - 如何使两点算法之间的最短路径更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35933892/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com