C++ 首先通过最近邻点从点a移动到所有剩余点

C++ 首先通过最近邻点从点a移动到所有剩余点,c++,c,algorithm,point,nearest-neighbor,C++,C,Algorithm,Point,Nearest Neighbor,我在图片中有多个点。垂直方向上最近的两个点之间的距离(在A和B之间,或B和C之间,或D和E等)为distance_y。水平方向上两个最近点之间的距离(在A和D等之间)为distance_x 假设: distance\u y

我在图片中有多个点。垂直方向上最近的两个点之间的距离(在
A
B
之间,或
B
C
之间,或
D
E
等)为
distance_y
。水平方向上两个最近点之间的距离(在
A
D
等之间)为
distance_x

假设:

distance\u y

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

           -

           C <-------------> F <-------------> I
例如,对于点
A
B
m=0
n=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).

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

我不确定是否理解,但看起来像是Dijkstra algoruthm应用程序:
您只有两种连接:长连接和短连接

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

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

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

总而言之:您可以在每个队列中逐个弹出。结果是一个包含节点的容器,您遍历每个节点并收集所有短距离容器,然后将它们添加到从中弹出容器的队列中,长距离容器也会发生同样的情况,只是它们被添加到了第一个队列中

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

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

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

只是为了确保:所有节点都通过所有可能的垂直和水平线连接?i、 例如,在您的情况下,有一个连接H-i?是的,每个节点都有一个垂直邻居和水平邻居。因此,有一个联系,H-IHe说他不想计算所有的距离,所以我假设他知道Dijkstras算法,并选择不使用它。你的答案很有趣。你能给我看一个简短的伪代码吗,这对我来说可能更清楚?无论如何,我所做的假设:distance_yO(k+nlgn)
,这并不坏。您的意思是您的代码适用于长距离和短距离的比率固定且事先知道的每种情况吗?比如说距离y=20,距离x=25?我不明白为什么在你的第一个答案中提到了3×Distangyy>2×Distangxx。更确切地说,程序会考虑总是考虑<代码> N< /代码>长得更好,然后<代码> N+1 短,所以是的,我必须改变答案中的语句。
A5---B2---C0---D2---E5 
|    |    |    |    |
F8---G4---H1---I4---L8
|    |    |    |    |
M10--N7---O3---R7---P10
|    |    |    |    |
W11--Y9---X6---T9---S11