让我们假设我们有2条曲线,曲线P和曲线Q.曲线P由点p1,p2 ... pn组成,曲线Q由点q1,q2 ... qm组成。在访问了所有点p1,p2,... pn之后,一个人从p1开始并在pn结束。在访问了所有q1,q2 ...... qm之后,一只狗从q1开始并以qm结束。
附加限制:必须连续访问分数。举一个例子,如果该男子在p3,他可以在p3等待,直到狗移动,他可以移动到p4,但他永远不会回去到p2。这同样适用于狗。
我们将2点的距离定义为d(pi,qj)。我们假设d(pi,qj)是在O(1)处计算的。所有距离d(pi,qj)都是已知的。
我们的任务是找到人与狗之间发生的最小可能最大距离(最小皮带)d,同时它们向pn和qm移动。
举一个例子,如果d(p1,q1)= 1,d(p1,q2)= 2,d(p1,q3)= 3,d(q2,p1)= 2.5,d(p2,q2) )= 2.2和d(p2,q3)= 1.8,则最小最大距离为2.
第1步:人和狗在p1和q1。当前最大距离为1。
第二步:男子继续在p1,狗移动到q2。当前最大距离为2。步骤3:人和狗分别同时移动到p2和q3。最大距离仍为2.
这个任务最合适的算法是什么?看起来像是一个frechet距离问题......
答案 0 :(得分:2)
我建议动态编程。每个步骤最多有三个可能的先前位置。让f(i,j)
成为从(p1,q1)
到(pi,pj)
的最小最小牵引距离。
然后:
f(i,j) = max( d(pi,qj), min(f(i-1,j), f(i,j-1), f(i-1,j-1)) )
您可以考虑构建一个矩阵来保持自下而上的计算(实际上是从左上角发出的三角形),或者另一种选择可能是记忆递归函数。矩阵可以在O(m*n)
时间内构建,并且实际上只需要两行空间。举个例子,我们有:
d(p1,q1) =1 , d(p1,q2)=2 , d(p1,q3)=3 ,d(q2,p1)=2.5 ,d(p2,q2)=2.2 and d(p2,q3)=1.8
f(2,3) = max(1.8, min(f(1,3),f(2,2),f(1,2)))
显然f(1,2)
是最小评估中最低的,导致2作为解决方案。
dp
构造的顺序看起来像这样,因为f(i-1,j-1)
是f(i-1,j)
和f(i,j-1)
的父级,但f(i,j)
需要这三个:
1,1
2,1 1,2
3,1 2,2 1,3
4,1 3,2 2,3 1,4
5,1 4,2 3,3 2,4 1,5
显然,有一些关于计算更有效解决方案的已发表的工作。例如:Agarwal et al. Computing the discrete Fréchet distance in subquadratic time
以下是一篇文章介绍了上述dp算法的正式处理方法:Eiter & Mannila. Computing Discrete Frechet Distance