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

时间:2017-03-19 22:15:52

标签: 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有连接。这将显示为

{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()的最有效版本?

1 个答案:

答案 0 :(得分:0)

首先,对于未排序的邻接列表,包含检查(迭代)是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, [])

其次,对于排序的邻接列表,包含检查(使用bisect的二进制搜索)是O(log N),其中N是从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)

graph = {A:{B:null, D:null}, B:{A:null}, C:{}, D:{A:null}}
def has_connection(graph, v1, v2):
    return v2 in graph.get(v1, {})

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