首先通过最近邻点从A点行进到所有剩余点

时间:2013-11-02 19:14:54

标签: c++ c algorithm point nearest-neighbor

我在图片中有多个点。垂直两个最近点之间的距离(在AB之间,或BC,或DE等之间的距离是distance_y。水平两个最近点之间的距离(AD之间的距离等)为distance_x

假设:

distance_y < distance_x < 2*distance_y

                distance_x
           A <-------------> D <-------------> G
           | 
distance_y |
           | 
           B <-------------> E <-------------> H

           -

           C <-------------> F <-------------> I

我按照以下方式制定两个任意点之间的距离:

Distance(point P1, point P2) = m * distance_x + n * distance_y 

例如,针对点ABm = 0n = 1;

问题是:从点P开始,我如何首先通过最近的邻居(即远离点P的距离的降序)遍历所有剩余点?

我不想计算从其他点到P的整个距离,然后按距离P的降序排序这些点,因为这很耗时。我想搜索能够快速评估邻居位置而不计算其他点位置的算法。

例如,从点D开始,以下几点将是

E (m= 0, n = 1),
A (m= 1, n = 0),
G (m= 1, n = 0),
F (m =0, n = 2),
B (m= 1, n = 1),
H (m= 1, n = 1),
C (m= 1, n = 2),
I (m= 1, n = 2).

如何确定搜索最近邻居的mn的顺序?

2 个答案:

答案 0 :(得分:0)

不确定我理解,但看起来像Dijkstra算法应用程序: {{3P>

答案 1 :(得分:0)

您只有两种连接:长和短。

将图形存储为邻接列表,其中每个节点有2个容器,而不是节点列表。第一个容器具有所有短(y)个距离节点,而第二个长(x)个距离节点。

在图表上执行BFS搜索,唯一的区别是您将拥有两个搜索队列。

从起始节点:您将短距离容器添加到第一个队列,并将长距离添加到第二个队列。您从第一个队列中弹出容器并浏览其元素并将每个节点的所有短距离容器分组为一个并将它们添加到第一个队列并将其长度(也都组合在一起)添加到第二个队列,然后从中弹出一个容器第二个队列,对于该容器中的每个节点,您将短距离容器一起添加到一个大的容器中,然后将大的一个容器添加到第二个队列,并将长距离容器添加到第一个然后再次从第一个队列中弹出一个容器......

总结一下:你逐个弹出每个队列。结果是一个带有节点的容器,你遍历每个节点并收集所有短距离容器并将它们添加到你弹出容器的队列中,同样的事情发生在长距离容器上,只是它们被添加到第一个容器中队列中。

唯一的问题是使用此算法n long总是比n+1短。

这是遍历从C开始的样子,每个节点旁边的数字显示它们的到达顺序。

A5---B2---C0---D2---E5 
|    |    |    |    |
F8---G4---H1---I4---L8
|    |    |    |    |
M10--N7---O3---R7---P10
|    |    |    |    |
W11--Y9---X6---T9---S11