Algorithm 如何为一个大的、完整的、欧几里德加权图生成一个排序的边列表?

Algorithm 如何为一个大的、完整的、欧几里德加权图生成一个排序的边列表?,algorithm,graph,Algorithm,Graph,我有一个完整的欧几里德图,即边权重由节点之间的欧几里德距离确定,该距离位于2D空间,该空间太大~100k个节点,无法容纳完整的边列表 我有没有办法按边权重排序生成边 如果我可以在内存中拟合边列表,我只需要创建一个边长度列表,然后对total time=OV^2*E log E进行排序。否则,除了在一些未知算法中使用KDTree之外,我不知道如何进行排序。我知道Jon Bentley在将邻近结构应用于几何TSP方面做了一些工作。我不确定他是否描述了这样的算法 将所有点插入kd树。维护从点到度的贴图

我有一个完整的欧几里德图,即边权重由节点之间的欧几里德距离确定,该距离位于2D空间,该空间太大~100k个节点,无法容纳完整的边列表

我有没有办法按边权重排序生成边


如果我可以在内存中拟合边列表,我只需要创建一个边长度列表,然后对total time=OV^2*E log E进行排序。否则,除了在一些未知算法中使用KDTree之外,我不知道如何进行排序。

我知道Jon Bentley在将邻近结构应用于几何TSP方面做了一些工作。我不确定他是否描述了这样的算法

将所有点插入kd树。维护从点到度的贴图,初始值为0。初始化优先级队列,其中,对于每个点,有一个值等于该点及其最近邻的一对的条目,与之建立连接的最近邻不会引发次路径,关键是距离。例如,在C++中,从一个点到另一个队列条目维护一个映射,使用一个映射而不是一个优先级队列,并将迭代器的向量存储到映射中会更方便。初始化现有路径的不相交集数据结构,其中每个根存储其路径的阶数为1的端点或阶数为0的端点两次

重复执行以下操作:弹出优先级队列并添加边,更新度映射和不相交集数据结构。从kd树中删除新的二级顶点。对于优先级队列的每个受影响条目,都有一个2度顶点作为最近邻,或者是新路径的端点之一,请删除该条目,在kd树本身中查找三个最近邻,可能是其路径的端点,保证顶点不在路径上,并写回相应的条目

事实上,我不确定急切删除是否会是一场胜利。由于节点的最佳有效连接是长度不随时间减少,因此可以通过在出列时检查边是否是有效扩展来避免从队列中删除。如果不是,则重新计算priqueue条目


您可能更喜欢使用外部排序:

KD树如何帮助您?下界是OV^2,您已经知道OV^2 log V算法具有低常数因子外部排序,因此我猜任何带有对数查询的数据结构都不会对您有多大帮助。我想你能期望的最好结果是OV log V+V^2,但这看起来不太可能me@NiklasB. 实际上,我不确定这对我有什么帮助,我只是想,因为这是一个空间驱动的数据结构,而不是一个边缘查找字典+权重函数,这可能是解决方案的一部分。另外,我知道给定一组点的最近对算法。问题是我如何多次运行它来生成第二个最近的对、第三个最近的对等等。您可以枚举所有对,因为您无论如何都需要为每个对存储一条边。你的问题似乎是排序,但你不必在内存中这样做。你打算在操作上做什么?如果处理的是欧几里德二维空间,则不必在内存中保留边列表。您可以在需要时计算边权重,这是一个相当简单的计算,甚至可能比在某些边列表中搜索值更快。