【问题标题】:c++ Finding closest four of a set of points [closed]c ++查找一组点中最接近的四个[关闭]
【发布时间】:2014-10-14 04:00:02
【问题描述】:

我有一组点,每个点都有一个 x 和 y 坐标。我想找到最接近的这些点中的 4 个(如果绘制所有点将在不同的位置,但其中 4 个点总是彼此更接近,我希望能够确定哪一个这四个点是程序化的)。我该怎么做呢?我被告知它与 k-means 或最近邻有关,但从我目前的搜索结果来看,我不知道如何让它适用于我的情况,因为我正在寻找点的接近度相对于彼此而不是相对于某个固定点。任何有关要研究的主题/算法或代码 sn-ps 的建议将不胜感激。

我认为确切问题的图像可能会有所帮助。所以这 8 个点包含在一个向量中,我希望能够确定哪四个是聚集在右侧的点。

提前致谢。

【问题讨论】:

  • 你如何定义“彼此最接近”?四组中每对点之间的距离总和?
  • 4,7 真的固定了吗?在这种情况下,可能只有 35 组点,检查那些蛮力是绝对可行的。只有更高的n才会变成噩梦。
  • @Cameron - 如果您在窗口中可视化点,您会注意到包含四个点的区域的点密度更大,而集合中的其余点总是远离这个密集点地区。
  • @AlexanderGessler - 7 不是固定的,但在可视化时,其中四个总是靠得更近
  • 您可能想要研究计算拓扑和数据可视化。我隐约记得与此相关的一件事是在图中找到 Betti 数的问题,如果两点之间的距离小于一定距离,则它们是相邻的。

标签: c++ k-means nearest-neighbor


【解决方案1】:

构建一个 nlog(n) 复杂度的 Delaunay 三角剖分图,为了找到最短的 4 个边,需要遍历的边数少于 2n。 你可以试试poly2tri。 你会想像这样遍历边:选择一条边,到最短的连接边走三遍,然后对边长求和。保存到目前为止遇到的最小边和的顶点和长度和,并穷尽所有可能的最短相邻长度组合。

【讨论】:

  • 感谢您的建议,Mr.WorshipMe。这听起来像是可以工作的东西。我现在正在研究算法和 poly2tri,我会试一试。
  • @Stralo 祝你好运,如果这解决了您的问题,请标记为 :)
【解决方案2】:

蛮力方法是选择四个点(每个排列)的每个可能选择并计算例如: 1)由点包围的区域, 2)点的凸包的周长, 3) ... 并且您将通过获取由 1)、2) 或 3) 计算的最小值来找到您的四个点。

【讨论】:

  • 这个区域可能是个坏主意,那么 4 个共线点无论相距多远都会有 0 的距离。
  • 包含或包围所有 4 个点的圆的最小半径是另一种可能的度量
  • @MattMcNabb - 事实证明这个问题比我想象的更难解决。从你所说的来看,我想我可以使用opencv的 minenclosurecircle() 来绘制一个固定半径的圆(我知道),其中 8 个点中的每一个都作为一个圆的中心。而对于感兴趣的 4 个,因为他们靠得更近,他们的每个圈子都会包含其他三个点,但其他不想要的 4 个点将始终单独在他们的圈子中。听起来怎么样?
  • 您不必以一个点为中心(这可能不是最理想的)。事实上,如果你按照 Martin 的建议取每 4 个点的凸包,然后考虑它的两条对角线中较长的一条作为度量,我认为这可能相当于我的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多