从List <point> </point>获得3个最常见的Point

时间:2011-11-08 18:21:15

标签: c#

我有一个简单的问题,我没有找到如何有效地做(在C#中)。

我有一个点数列表数组(X,Y)。我需要找到哪3个点是最紧密的簇。这是一个绘图项目。

最好的方法是什么?列表中只有大约6到9个项目。

提前致谢。

干杯!

3 个答案:

答案 0 :(得分:1)

如果这些点不相同,则会成为cluster analysis的一种形式。

有各种算法在测量和“聚类”点方面有所不同,但只有几点,蛮力方法可能是最简单的...你可以只测量每对点之间的距离,并且排序...

答案 1 :(得分:1)

对于这么小的数字,蛮力方法应该可以正常工作。有六个点,有三个点的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;
    }
}

如果为每个组创建其中一个结构并将它们存储在一个数组中,则可以简单地对数组进行排序并获得最佳结果。

你的更大问题是提出“紧张群体”的定义。此外,您必须确定一个点是否可以在多个“最紧密”组中。定义紧密度的三种可能方法是:

  • 点之间距离的总和最小化。
  • 从每个点到组中心的平均距离最小化。
  • 由三个点形成的三角形的周长被最小化。

毫无疑问还有更多。

答案 2 :(得分:0)

您可以按如下方式简化问题:

  1. 不要检查自己的点;距离为零。
  2. 利用对称性:从点i到点j的距离与点j到点i的距离
  3. 那些消除了许多组合。

    但是,鉴于这些,您必须计算每对之间的距离并进行排序。