通过某种记忆来提高BFS性能

时间:2019-06-05 18:14:24

标签: python algorithm graph shortest-path

我遇到了这个问题,我正在尝试构建一种算法,该算法将查找图中一个顶点到另一个顶点的距离。

让我们举一个非常简单的例子,我的网络看起来像这样:

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)之类的函数,它不会从头开始计算所有内容,但能够访问矩阵中的某些值。

谢谢!

1 个答案:

答案 0 :(得分:0)

知道这还不能完全回答您的问题,但这是您尝试的另一种方法。

在网络中,您将为网络中的每个节点都有一个路由表。您可以简单地保存网络内所有节点以及必须进入哪个节点的列表。节点D的路由表示例

A -> B
B -> B
C -> E
D -> D
E -> E

您需要在每个节点上运行BFS来构建所有路由表,这将花费O(|V|*(|V|+|E|)。空间复杂度是二次的,但是您必须检查所有可能的路径。

创建所有这些信息时,您可以简单地从一个节点开始,然后在表内搜索目标节点,然后找到下一个要运行的节点。如果您为表使用正确的数据结构,这将提供更好的时间复杂性。