我有一个简单的问题,我没有找到如何有效地做(在C#中)。
我有一个点数列表数组(X,Y)。我需要找到哪3个点是最紧密的簇。这是一个绘图项目。
最好的方法是什么?列表中只有大约6到9个项目。
提前致谢。
干杯!
答案 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)
您可以按如下方式简化问题:
那些消除了许多组合。
但是,鉴于这些,您必须计算每对之间的距离并进行排序。