假设3D空间中有n
个不同的点,即P1, P2, P3, ..., Pn
。
将连接符C
定义为一组有序的线段,其中集合中的下一个元素应与前一个共享一个公共顶点。例如,{ P1-P2, P2-P4, P4-P7 }
是连接符,而{ P1-P2, P3-P4,P4-P2 }
则不是。
定义连接器的内容,作为连接器包含的点集。
定义连接器的大小,即连接器中最长单个段的长度。
如果最长的单个段是连接器中的第一个或最后一个段,则将连接器定义为正确的连接器。
如果点上的连接器内容的并集是一组点,则称一组点连接。
问题是:
鉴于k
具有相同幅度k < n
的正确连接器(m
)可以连接n
点,其坐标为最小值,{{1} }。
算法的要点是什么?我不知道从哪里开始。
答案 0 :(得分:0)
一个想法是从最远点开始,即与其他点的邻居相比,它最近的邻居是最远的。然后从中构建一个连接器,始终添加下一个点的最近邻居,直到你不能在不违反其中一个规则的情况下添加更多的点:
注意:最后一个条件太强了,因为可以允许适当连接器的最后一个边缘比第一个边缘大,但我考虑到算法也会用这样的“最后”边缘再做一次尝试作为第一个边缘,但方向相反:所以我可以在这个阶段排除那个边缘。
一旦找到这样合适的连接器,算法就可以回溯并尝试在另一个方向上分支,再次尽可能地进行。这种递归分支将导致一组适当的连接器。如果该集合至少有k个连接器,并且所有点都被至少一个这样的连接器覆盖,那么这是一个解决方案。
如果不能解决问题,可以重复整个逻辑,但这次第一条边必须有更大的尺寸。因此,将找到一个点,其中到最近邻居的距离(至少具有该距离)最大化。
以下是这种算法的更正式的草图:
Pre-processing:
List for each point all the other points in order of increasing distance from it.
set m = 0
Repeat:
set max_dist = 0, list = empty
For each point p:
Find the first neighbor q for which distance(p,q) > m
if distance(p,q) >= max_dist:
if distance(p,q) > max_dist:
clear list
append (p,q) to the list
let m = max_dist
For each pair (p,q) in the list (all these pairs have same distance m):
Let result = []
Let connector be [p,q]
Let p = q
Recursive part (p):
let end_point = True
For each neighbor q of p (in order of distance):
If distance(p,q) > m:
break loop
If q not in connector:
let end_point = False
Append q to connector
Call the recursive part for q
size(result) >= k and all points are in result:
exit recursion
Remove q from connector (backtracking)
If end_point:
append clone of connector to result
If size(result) >= k and all points are in result:
return m, as final result
答案 1 :(得分:0)
一些一般性的想法。您的问题可能有多种解决方案。我首先考虑一种蛮力方法,然后考虑是否可以改进该算法。另一个好方法是找到一个更容易解决的类似问题,并尝试将其转换为类似的问题。由于你不在问题中,我不会触及正确性和时间复杂性。
蛮力通常意味着尝试每种组合。构建涵盖所有节点的每个可能的连接链。
贪心算法:从随机节点开始。创建到最近节点的连接器。然后创建从该节点到其最近节点的连接器,该节点尚未连接。重复,直到所有节点都连接完毕。这可能并不总能给出最佳结果。
迭代方法:使用任何方法连接所有节点。然后尝试交换节点。选择具有最高幅度和Q随机连接器的节点B,连接器AB,BC和PQ,QR。产生AQ,QC和PB,BR并在其幅度减小时保持掉期。
也许可以使用线性编程。