如何以及为每个以下图形实现实现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()
的最有效版本?
答案 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, {})
因此,第三个实现比第二个更快,而第二个实现比第一个更快。这仅适用于足够大的图,其中相应算法的固有优势超过其实现开销。