我在数据库{STARTNODE,ENDNODE}中指导了以下格式存储的图形.因此,{5,3}表示从节点5到节点3有一个箭头.
现在我需要计算两个随机节点之间的距离.什么是最有效的方式?顺便说一下,图表有循环.
非常感谢!
如果距离指的是最小跳数,那么您可以使用 Guido van Rossum 的find_shortest_path函数:
def find_shortest_path(graph, start, end, path=[]):
"""
__source__='https://www.python.org/doc/essays/graphs/'
__author__='Guido van Rossum'
"""
path = path + [start]
if start == end:
return path
if not graph.has_key(start):
return None
shortest = None
for node in graph[start]:
if node not in path:
newpath = find_shortest_path(graph, node, end, path)
if newpath:
if not shortest or len(newpath) < len(shortest):
shortest = newpath
return shortest
if __name__=='__main__':
graph = {'A': ['B', 'C'],
'B': ['C', 'D'],
'C': ['D'],
'D': ['C'],
'E': ['F'],
'F': ['C']}
print(find_shortest_path(graph,'A','D'))
# ['A', 'B', 'D']
print(len(find_shortest_path(graph,'A','D')))
# 3
Run Code Online (Sandbox Code Playgroud)
假设距离是跳数,并且是最优的(最短路径)。您可以使用 Python 的列表/集合来跟踪已访问的节点和当前可到达的节点。从第一个节点开始,然后从当前节点集不断跳跃,直到到达目标。
例如,给定这个图:

[hop 0]
visited: {}
current: {A}
[hop 1]
visited: {A}
current: {B, C, J}
[hop 2]
visited: {A, B, C, J}
current: {D, E, F, G, H}
[hop 3]
visited: {A, B, C, D, E, F, G, H, J}
current: {K} // destination is reachable within 3 hops
Run Code Online (Sandbox Code Playgroud)
访问节点列表的目的是为了防止访问访问过的节点,从而导致循环。为了获得最短距离,重新访问是没有用的,因为它总是会使结果路径的距离更长。
这是广度优先搜索的简单实现。效率部分取决于如何检查访问过的节点,以及如何查询给定节点的相邻节点。广度优先搜索始终保证提供最佳距离,但如果数据库中有大量节点(例如十亿/百万),这种实现可能会产生问题。我希望这能给出这个想法。
| 归档时间: |
|
| 查看次数: |
18765 次 |
| 最近记录: |