我试图解决的问题涉及大约5000个GPS点的数据集,以及在该数据集中找到导致最大总距离的5个点的任务。
(请注意,开始和结束不一定在同一位置)
天真的解决方案是五个嵌套循环,迭代数据集中的所有点,直到找到最大的总距离,但鉴于距离计算有点慢,这是不切实际的:
for (i = 0; i < points.length; i++) {
pointA = points[i];
for (j = i; j < points.length; j++) {
pointB = points[j];
distanceAB = distance(pointA, pointB);
for (k = j; k < points.length; k++) {
pointC = points[k];
distanceBC = distance(pointB, pointC);
// ...
score = distanceAB + distanceBC + distanceCD + distanceDE;
if (score > winner.score) {
// save new winner
}
}
}
}
这个问题的解决方案是否需要做更少的工作?
答案 0 :(得分:2)
非封闭有序路径5点
如果要对路径中的点进行排序,则需要找到具有固定边数的DAG中的最长路径。这可以通过简单的dynamic programming算法来完成。再次发生是
答案是:max(f(i,4))
。
5点封闭有序路径
如果我们需要在图片上找到一个封闭的路径(带有有序点),那么对于每个start
点,我们需要找到这个函数的值:
以start
为起点的封闭路径的最大长度为
longest(start) = max(f(i,4) + dist(i,start))
。
因此,答案将是:max(longest(start))
。