我确信有很多关于如何完成我所追求的信息,但这是一个不知道它的技术术语的问题。基本上我想要创建的是有向图的邻接矩阵,而不是简单地存储每个顶点对是否具有直接邻接,对于我想存储的矩阵中的每个顶点对。连接两者的任何路径(以及那些路径是什么)。
这会给我带来恒定的查找时间复杂度,但是我不能立即明白构建这个矩阵的预期最佳时间复杂度。
此外,这种矩阵是否有正式名称?
在我的脑海里播放这个,这似乎是一个动态的编程问题。如果我想知道A是否连接到Z,我应该能够询问A的每个邻居B,C和D是否(以某种方式)连接到Z,如果是,那么我知道A是。如果B没有存储这个答案,那么他会问同样的问题他的直接邻居,依此类推。我会记住结果,因此后续查找将是不变的。
我还没有花时间实现这个,因为感觉就像Θ(n ^ n)来构建一个完整的矩阵,所以我的问题是我是否正确地采用这种方式,如果确实如此有一种建立这种矩阵的低成本方法吗?
答案 0 :(得分:1)
图形(https://en.wikipedia.org/wiki/Transitive_closure#In_graph_theory)的传递闭包确实可以通过Floyd Warshall算法的变体动态编程来计算:https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm。
使用| V |但是,DFS(或BFS)更有效率。
答案 1 :(得分:0)
使用networkx connected components
G = nx.path_graph(4)
G.add_path([10, 11, 12])
d = {}
for group in idx, group in enumerate(nx.connected_components(G)):
for node in group:
d[node] = idx
def connected(node1, node2):
return d[node1]==d[node2]
生成O(N)
查找应为O(1)