我有一个完整的欧几里德图(即边缘权重由位于2D空间中的节点之间的欧几里德距离决定),它太大(~100k节点),以便全边列表位于内存中。 / p>
我有什么方法可以按边缘权重排序生成边缘?
如果我可以将边缘列表放在内存中,我只需创建一个边长度列表然后排序(总时间= O(V ^ 2 * E log E))。否则,我不知道除了在某种未知算法中使用KDTree之外该怎么做。
答案 0 :(得分:0)
我知道Jon Bentley在将接近结构应用于几何TSP方面做了一些工作。我不确定他是否描述了这样的算法。
将所有点插入kd树中。保持从点到度的地图(最初为0)。初始化一个优先级队列,其中,对于每个点,有一个条目的值等于该点和它的最近邻居的一对(后来,最近与之建立连接的人不会引起一个子句),关键是距离。维护从点到它们所涉及的队列条目的映射(例如,在C ++中,使用映射而不是优先级队列并将迭代器的向量存储到映射中会更方便)。为现存路径初始化一个不相交的集合数据结构,其中每个根存储其路径的degree-1端点(或者0度端点两次)。
重复执行以下操作:弹出优先级队列并添加边缘,更新度数图和不相交的集数据结构。从kd树中删除第二级新的顶点。对于优先级队列的每个受影响的条目(具有度数-2顶点作为最近邻居,或者是新路径的端点之一),删除该条目,查找kd树中的三个最近邻居(本身,可能它的路径的端点,顶点保证不在路径上)并写回相应的条目。
实际上我不确定急切的删除会是一场胜利。由于节点的最佳有效连接长度不随时间减小,因此可以通过在出队时检查边是否是有效扩展来避免删除。如果没有,则重新计算priqueue条目。
您可能更喜欢使用外部排序:)