Python-实现图形并检查边和顶点之间的连接

Python-实现图形并检查边和顶点之间的连接,python,function,dictionary,graph,adjacency-list,Python,Function,Dictionary,Graph,Adjacency List,如何以及什么是为以下每个图形实现实现hasConnection()函数的最有效方法。我指的是一个可以检查两个顶点之间是否存在连接的函数,例如hasConnection(vertex1,vertex2) 实现A:由未排序的邻接列表字典表示。例如,如果一个图具有顶点a、B、C和D。a与B和D有连接。这将显示为 {A:[D,B],B:[A],C:[],D:[A]} 实现B:由包含排序邻接列表的词典的词典表示。内部字典具有名为“邻接顶点”的键。例如,如果一个图具有顶点a、B、C和D。a与B和D有连接。这

如何以及什么是为以下每个图形实现实现
hasConnection()
函数的最有效方法。我指的是一个可以检查两个顶点之间是否存在连接的函数,例如
hasConnection(vertex1,vertex2)

实现A:由未排序的邻接列表字典表示。例如,如果一个图具有顶点a、B、C和D。a与B和D有连接。这将显示为

{A:[D,B],B:[A],C:[],D:[A]}

实现B:由包含排序邻接列表的词典的词典表示。内部字典具有名为“邻接顶点”的键。例如,如果一个图具有顶点a、B、C和D。a与B和D有连接。这将显示为

{A:{adjacentVertices:[B,D]},B:{adjacentVertices:[A]},C:{adjacentVertices:[]},D:{adjacentVertices:[A]}

实现C:由包含其键值为“null”的词典的词典表示。关键点表示相邻顶点。例如,如果一个图具有顶点a、B、C和D。a与B和D有连接。这将显示为

{A:{B:null,D:null},B:{A:null},C:{},D:{A:null}


最后,对于每个实现,代码需要是什么?哪一个是
hasConnection()
的最有效版本?

首先,对于未排序的邻接列表,包含检查(迭代)是
O(N)
,其中N是从v1开始的边数:

graph = {A:[D, B], B:[A], C:[], D:[A]}
def has_connection(graph, v1, v2):
    return v2 in graph.get(v1, [])
graph = {A: {'adjacentVertices': [B, D]}, B: {'adjacentVertices': [A]}, C: {'adjacentVertices': []}, D: {'adjacentVertices': [A]}}
import bisect
def has_connection(graph, v1, v2):
    vs = graph.get(v1, {}).get('adjacentVertices', [])
    try:
        return v2 == vs[bisect.bisect_left(vs, v2)]
    except IndexError:
        return False
其次,对于排序的邻接列表,包含检查(使用二进制搜索)是
O(logn)
,其中N是从v1开始的边数:

graph = {A:[D, B], B:[A], C:[], D:[A]}
def has_connection(graph, v1, v2):
    return v2 in graph.get(v1, [])
graph = {A: {'adjacentVertices': [B, D]}, B: {'adjacentVertices': [A]}, C: {'adjacentVertices': []}, D: {'adjacentVertices': [A]}}
import bisect
def has_connection(graph, v1, v2):
    vs = graph.get(v1, {}).get('adjacentVertices', [])
    try:
        return v2 == vs[bisect.bisect_left(vs, v2)]
    except IndexError:
        return False
最后,对于邻接字典,包含检查(哈希查找)是
O(1)


因此,第三种实现方式比第二种实现方式快,而第二种实现方式又比第一种实现方式快。这只适用于足够大的图,其中相应算法的固有优势超过了其实现开销。

对于“hasConnection”,唯一最有效的方法是拥有一组连接对。老实说,我似乎遇到了一个障碍,不管我是不是记不住什么或是没有正确地知道它。我想的只是在字典和列表中搜索和for循环之间有什么区别,但我可能完全不知道。确实是lejlot,但它需要用于每个实现,而不是成对的,抱歉。谢谢