在大清单中找到彼此的近点

时间:2016-05-17 15:57:16

标签: c# linq

我有一个结构节点的大型列表(如300000个元素),其中Node被定义为

public struct Node
{
    public int nid;
    public double x, y, z;
}

我想知道哪些节点彼此接近一定量(在代码中称为间隙),以便将元素组合在一起。 请注意,对于给定的节点分布,每个节点只属于一个集合。

我尝试了这种方式,使用Linq查询循环每个节点并查找其邻居,以及3d空间中两点之间距离的经典公式,但它真的慢。

有什么建议吗?提前谢谢。

List<Node> nList;
[...]

for (int i = 0; i < nList.Count; i++) // cycles through all nodes in list
{
    Node nodo_old = nList[i]; // current node

    List<Node> nset = nList.Where(n => (Math.Sqrt(Math.Pow((n.x - nodo_old.x),2) + Math.Pow((n.y - nodo_old.y), 2) + Math.Pow((n.z - nodo_old.z), 2)) <= gap)).ToList();

    [...]  // now nset contains a list of neighbour nodes
}

1 个答案:

答案 0 :(得分:0)

此算法删除已检查的节点以减少处理时间。我没有尝试过你的问题,但我相信它会对你有所帮助,因为我在另一个场景中进行了测试,并且效果很好。

// to hold sets of neighbour nodes
Dictionary<int, List<Node>> relatedCollectionsDictionary = new Dictionary<int, List<Node>>();
int index = 0;

List<Node> nList;

while (nList.Any())
{
    var relatedCollection = nList.Where(n => (Math.Sqrt(Math.Pow((n.x - nList.First().x), 2) + Math.Pow((n.y - nList.First().y), 2) + Math.Pow((n.z - nList.First().z), 2)) <= gap));

    List<Node> relatedCollectionList = relatedCollection.ToList();
    List<Node> relatedCollectionListForDictionary = relatedCollection.ToList();

    relatedCollectionsDictionary.Add(index++, relatedCollectionListForDictionary);

    while (relatedCollectionList.Any())
    {
        nList.Remove(relatedCollectionList.First());
        relatedCollectionList.RemoveAt(0);
    }
}

这个想法是你每次都要做很多处理并遍历所有节点。但是使用这种情况,您不会多次遍历任何项目。