我在数据库中有数据,其形式为:
A -> B
C -> D
B -> C
F -> G
G -> J
X -> Z
这基本上意味着A转到B,C转到D等。鉴于此数据和节点(例如C),我想构建完整的路径,找到C的是A - > B - > C - > D.我尝试通过使用一些字典和递归循环来做到这一点但我不喜欢这样一个缓慢的解决方案,因为db中有大量数据。有什么更好的方法来解决这个问题?在算法和数据结构方面?任何想法或提示都表示赞赏。
答案 0 :(得分:2)
你基本上看DFS,但你需要做两次 - 每个方向一次。
首先从反向'图'做一个DFS,从C开始。
在您的示例中,它会为您提供Path1 = C->B->A
接下来,再次从C在原始图表上执行DFS。
在您的示例中,它会为您提供Path2= C->D
现在,通过撤消Path1
,并将Path2
合并到它,您将获得:
reverse(Path1) + Path2 = A->B->C + C->D = A->B->C->D
澄清 - DFS只是抽象,你实际做的是类似于(伪代码):
current <- C
list = []
while (current != null):
list.addFirst(current)
current <- u such that (u,current) is in the DataBase
current <- C
list.deleteLast() // last is C
while (current != null):
list.addLast(current)
current <- u such that (current,u) is in the DataBase
请注意,查找u
这两种情况都是一个简单的字典查找,第一个是“目标”是键,第二个“源”是键。