首先通过最近邻点从一个点 A 移动到所有剩余点

Travel from a point A to all remaining points via nearest neighbor point first

本文关键字:移动 一个 余点 最近 近邻      更新时间:2023-10-16

我在图片中表示了多个点。垂直方向上两个最近点之间的距离(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顺序?

不确定我是否理解,但看起来像Dijkstra算法应用程序:http://en.wikipedia.org/wiki/Dijkstras_algorithm

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

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

对图形执行 BFS 搜索,唯一的区别是您将有两个搜索队列。

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

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

唯一的问题是,使用这种算法n长总是比n+1短更好。

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

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