我遇到了这个问题,我正在尝试构建一种算法,该算法将查找图中一个顶点到另一个顶点的距离。
让我们举一个非常简单的例子,我的网络看起来像这样:
network = [[0,1,2],[2,3,4],[4,5,6],[6,7]]
我创建了一个BFS代码,该代码应查找从指定源到其他图形顶点的路径长度
from itertools import chain
import numpy as np
n = 8
graph = {}
for i in range(0, n):
graph[i] = []
for communes in communities2:
for vertice in communes:
work = communes.copy()
work.remove(vertice)
graph[vertice].append(work)
for k, v in graph.items():
graph[k] = list(chain(*v))
def bsf3(graph, s):
matrix = np.zeros([n,n])
dist = {}
visited = []
queue = [s]
dist[s] = 0
visited.append(s)
matrix[s][s] = 0
while queue:
v = queue.pop(0)
for neighbour in graph[v]:
if neighbour in visited:
pass
else:
matrix[s][neighbour] = matrix[s][v] + 1
queue.append(neighbour)
visited.append(neighbour)
return matrix
bsf3(graph,2)
首先,我要创建图形(字典),然后使用该函数查找距离。
我担心的是,这种方法不适用于较大的网络(假设其中有1000人)。我正在考虑的是使用某种形式的记忆(实际上这就是为什么我制作矩阵而不是列表的原因)。这个想法是,当算法计算出从0到3的路径时(它已经做了什么),它应该以矩阵[1] [3] = 1等的方式跟踪另一条路径。
因此,我将使用bsf3(graph,1)之类的函数,它不会从头开始计算所有内容,但能够访问矩阵中的某些值。
谢谢!
答案 0 :(得分:0)
知道这还不能完全回答您的问题,但这是您尝试的另一种方法。
在网络中,您将为网络中的每个节点都有一个路由表。您可以简单地保存网络内所有节点以及必须进入哪个节点的列表。节点D的路由表示例
A -> B
B -> B
C -> E
D -> D
E -> E
您需要在每个节点上运行BFS来构建所有路由表,这将花费O(|V|*(|V|+|E|)
。空间复杂度是二次的,但是您必须检查所有可能的路径。
创建所有这些信息时,您可以简单地从一个节点开始,然后在表内搜索目标节点,然后找到下一个要运行的节点。如果您为表使用正确的数据结构,这将提供更好的时间复杂性。