首先通过最近邻点从一个点 A 移动到所有剩余点
Travel from a point A to all remaining points via nearest neighbor point first
我在图片中表示了多个点。垂直方向上两个最近点之间的距离(A
和B
之间,或B
和C
,或D
和E
等)是distance_y
。水平上两个最近点之间的距离(A
和 D
等)为 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
例如,对于点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算法应用程序: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
- 如果需要转换,我可以在读取参数的同时将其移动到另一个参数吗?
- 如何知道是否移动一个物体
- 当在SFML C 中移动一个圆圈时,球后面会有口吃的束缚小故障
- 从另一个函数的"if loop"中调用/移动一个函数 - Qt,C++
- 我应该移动一个不再使用的值吗?
- 移动一个结构数组C++
- 在OpenGL中移动一个简单的形状(形状在数据结构中)
- 如果我移动一个值进行注册和编辑,它将有所作为
- 在保龄球比赛中,一旦按下一个键,就移动一个球
- 想要移动一个2d对象而不是另一个
- 关于移动一个const对象
- 在现代opengl中移动一个形状/对象
- 移动一个矩阵
- 沿着二维网格移动一个值
- 为什么编译器需要一个复制构造函数,需要并移动一个并且不使用它们中的任何一个?
- 如何从数组中删除一个元素并将所有元素向上移动一个位置
- 我有一个字符数组,我想把它的二进制位向右移动一个
- 在c++ 11中从std::deque中移动一个元素
- 如何在c++中操纵/移动一个网格中的对象
- 如何在不移动整个场景的情况下移动一个2d对象?