从列表中获得3个最常见的点
本文关键字:3个 常见 列表 Point | 更新日期: 2023-09-27 18:13:45
我有一个快速的问题,我还没有发现如何有效地做(在c#中)
我有一个点(X,Y)的列表数组。我需要找出哪三个点是最紧密的簇。这是一个映射项目。
最好的方法是什么?列表中只有6到9个项目。
提前感谢。
干杯!
对于这么小的数字,蛮力方法应该可以很好地工作。有6个点,3个点有20种可能的组合。有9个点,有84种可能的组合。我不建议在很多情况下使用这种方法,但只使用少数几个点,它就足够快了,而且编写起来非常简单。
您可以轻松地生成组合:
for (int i = 0; i < points.Length - 2; ++i)
{
for (j = i + 1; j < points.Length - 1; j++)
{
for (k = j + 1; k < points.Length; k++)
{
// Here, your three points are
// points[i], points[j], and points[k]
// compute "tightness" and store
}
}
}
你需要一个结构来保存你的组合:
struct PointGroup
{
public readonly int i;
public readonly int j;
public readonly int k;
public readonly double tightness;
public PointGroup(int i, int j, int k, double tight)
{
this.i = i;
this.j = j;
this.k = k;
this.tightness = tight;
}
}
如果您为每个组创建一个这样的结构,并将它们存储在数组中,您可以简单地对数组进行排序,并取最好的三个。
你更大的问题是想出一个"紧密群体"的定义。此外,你必须决定一个点是否可以出现在多个"最紧密"的组中。定义紧度的三种可能方法是:
- 点之间的距离之和被最小化。
- 每个点到组中心的平均距离最小。
- 由三个点组成的三角形的周长被最小化。
如果这些点不相同,这就成为一种聚类分析的形式。
有各种各样的算法在如何测量和"聚类"点方面有所不同,尽管只有几个点,蛮力方法可能是最简单的…你可以测量每对点之间的距离,然后排序。
你可以把问题简化如下:
- 不要检查一个点对它自己;
- 利用对称性:从点i到点j的距离与点j到点i的距离相同
这些消除了许多组合。
但是,给定这些,你必须计算每对和排序之间的距离