Algorithm 从连接线点查找三角形的最快方法

Algorithm 从连接线点查找三角形的最快方法,algorithm,line,Algorithm,Line,我想找出一种方法来检测连接线中的所有三角形。我有一个包含所有可用线的数组列表,称为线,当我添加另一条线时,我想知道它是否创建了新的三角形。如下图所示,只要我添加新线f,该线用索引1,3连接点。我需要一种快速的方法来检测新三角形的创建,并将索引1,3,5添加到另一个名为triangles的数组列表中 //具有行索引的数组,每行包含两个点索引 val行:ArrayList=arrayListOf( 0,1,//a 1,5,//b 5,4,//c 5,3,//d 5,2//e ) val三角形:Ar

我想找出一种方法来检测连接线中的所有三角形。我有一个包含所有可用线的数组列表,称为线,当我添加另一条线时,我想知道它是否创建了新的三角形。如下图所示,只要我添加新线f,该线用索引1,3连接点。我需要一种快速的方法来检测新三角形的创建,并将索引1,3,5添加到另一个名为triangles的数组列表中

//具有行索引的数组,每行包含两个点索引
val行:ArrayList=arrayListOf(
0,1,//a
1,5,//b
5,4,//c
5,3,//d
5,2//e
)
val三角形:ArrayList=arrayListOf()
我提出的一种方法是,创建一个数组列表,其中包含每个点的单独数组列表以及它所连接的所有索引。例如,索引为5的点连接到索引为[1,2,3,4]的点。因此,当添加一条连接索引3,1的新线时,我们可以检查 数组列表circlesHash[3]和circlesHash[1]包含相等的元素。在我们的例子中,两个数组都包含索引5,这意味着创建了索引3,1,5的三角形。如果数组列表已排序,我可以使用方法Arrays.binarySearch。但是如果我有大量的点,例如1000-2000点,那么最快的方法是什么来发现是否创建了新的三角形

val circlesHash: ArrayList<ArrayList<Int>> = arrayListOf(  
    arrayListOf(1),               // 0   
    arrayListOf(0,5),             // 1
    arrayListOf(5),               // 2
    arrayListOf(5),               // 3
    arrayListOf(5),               // 4
    arrayListOf(1,2,3,4)          // 5
)
val circlesHash:ArrayList=arrayListOf(
arrayListOf(1),//0
arrayListOf(0,5),//1
arrayListOf(5),//2
arrayListOf(5),//3
arrayListOf(5),//4
arrayListOf(1,2,3,4)//5
)

另一个问题是,是否存在只从现有直线的索引中查找所有现有三角形的现有算法。什么样的结构更适合HashMaps、HashSet或某种二叉树?

最简单的解决方案是通过共享点对边。因此,如果一个端点相同,则两条边是成对的。然后为每一对选择两个边不共享的节点,在它们之间插入一条边,就形成了一个三角形。假设您的图不是多重图,此算法不会生成任何重复项并查找所有三角形

从这里开始,我们可以创建一个不存在的边列表,并创建一个三角形。作为伪代码:

triangle_candidates(g):
    triangle_edges = set()

    for e1 in g.edges:
        for e2 in g.edges:
            if e1 and e2 share a node:
                a, b = nodes not shared by e1 and e2
                if a and b are not neighbors:
                    triangle_edges.add(tuple(a, b))

    return triangle_edges

creates_new_triangle(g, a, b):
    return tuple(a, b) in triangle_edges(g)
注意,元组被假定为非有序的!上述代码是基本原理的演示;在
triangle\u候选者中仍有很大的优化空间

其基本思想是创建一组不是邻居的所有节点对,但如果连接,则将完成一个长度为3的循环。检查一条新边是否会创建一个三角形是一个简单的集合查找,假设实现正确,这应该相当快

triangle_candidates(g):
    triangle_edges = set()

    for e1 in g.edges:
        for e2 in g.edges:
            if e1 and e2 share a node:
                a, b = nodes not shared by e1 and e2
                if a and b are not neighbors:
                    triangle_edges.add(tuple(a, b))

    return triangle_edges

creates_new_triangle(g, a, b):
    return tuple(a, b) in triangle_edges(g)