输入是一系列点坐标(x0,y0),(x1,y1)......(xn,yn)(n不是很大,比如说~1000)。我们需要创建一些矩形作为这些点的边界框。没有必要找到全局最优解决方案。唯一的要求是如果两点之间的欧氏距离小于R,它们应该在同一个边界矩形中。我已经搜索了一段时间,它似乎是一个聚类问题,K-means方法可能是一个有用的方法。 但是,输入点坐标不时没有特定的模式。因此,可能无法在K-mean中设置特定的K.我想知道是否有任何算法或方法可以解决这个问题?
答案 0 :(得分:2)
唯一的要求是如果两点之间的欧氏距离小于R,它们应该在同一个边界矩形中
这是在R的高度切割的单链接层次聚类的定义。
请注意,这可能会产生重叠的矩形。
对于更快,更高效的方法,请查看R * -trees的批量加载策略,例如sort-tile-recursive。它不会满足您上面的“唯一”要求,但它会产生平衡的,非重叠的矩形。
K-means显然不适合您的要求。
答案 1 :(得分:0)
只有1000分,我会做以下几点:
1)计算出所有点对之间的差异。如果一对的距离小于R,则需要进入相同的边界矩形,因此请使用http://en.wikipedia.org/wiki/Disjoint-set_data_structure进行记录。
2)对于从Disjoint集数据结构中出来的每个子集,计算出其中点的最小和最大坐标,并使用它来为该子集中的点创建边界框。
如果您有更多积分或担心效率,您将希望提高阶段(1)效率。一种简单的方法是按照x坐标的顺序遍历各点,只保留最近点到最左点的R点,并使用平衡树结构从这些点找到最多R点以上或者在最近看到的点之前,在计算到最近点的距离之前。与此相关的一步是创建一个空间数据结构,以便更有效地找到距离为R的对。
请注意,对于某些输入,您将获得一个巨大的边界框,因为您有长链点,而对于其他一些输入,您将在边界框内获得边界框,例如,如果您的点是同心圆。