C# 从列表中获取3个最常见点<;点>;
我有一个快速的问题,我还没有发现如何有效地(用C#)完成 我有一个点(X,Y)的列表数组。我需要找出哪3个点是最紧密的簇。这是一个地图项目 最好的方法是什么?列表中只有大约6到9项 提前谢谢C# 从列表中获取3个最常见点<;点>;,c#,C#,我有一个快速的问题,我还没有发现如何有效地(用C#)完成 我有一个点(X,Y)的列表数组。我需要找出哪3个点是最紧密的簇。这是一个地图项目 最好的方法是什么?列表中只有大约6到9项 提前谢谢 干杯 您可以将问题简化如下: 不要把一个点和它自己对照;距离是零 利用对称性:从点i到点j的距离与点j到点i的距离相同 这些消除了许多组合 但是,考虑到这些,您必须计算每对之间的距离并进行排序。如果点不相同,这将成为一种排序形式 有各种算法在测量和“聚集”点的方式上有所不同,尽管只有少数点,暴力方法可能是最
干杯 您可以将问题简化如下:
但是,考虑到这些,您必须计算每对之间的距离并进行排序。如果点不相同,这将成为一种排序形式
有各种算法在测量和“聚集”点的方式上有所不同,尽管只有少数点,暴力方法可能是最简单的。。。你可以测量每对点之间的距离,然后排序…对于这样小的数字,蛮力法应该可以很好地工作。对于六个点,有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;
}
}
如果您为每个组创建其中一个结构并将它们存储在一个数组中,您只需对数组进行排序,然后取最好的三个
你更大的问题是“紧密小组”的定义。此外,你必须决定一个点是否可以位于多个“最紧密”小组中。定义气密性的三种可能方法是:
- 点之间的距离之和最小化
- 从每个点到组中心的平均距离最小化
- 三个点形成的三角形的周长最小化
毫无疑问还有更多。谢谢!我决定用蛮力技术。干杯,谢谢你的建议。@PetarMinchev Tight cluster——我的意思是3点之间最接近。