【问题标题】:Running DFS on large graph在大图上运行 DFS
【发布时间】:2016-09-01 22:19:19
【问题描述】:

我试图在实现 Kosaraju 算法的大图中找到强连通分量。它需要在图形上反向运行 DFS,然后向前运行。如果您对此图的边列表感兴趣,请点击此处:https://dl.dropboxusercontent.com/u/28024296/SCC.txt.tar.gz

我无法在 Python 中递归地实现它,如果我增加它们,它会超出其递归限制并崩溃。我正在尝试通过迭代来实现。

下面是我的代码 1. 将图形反向加载到字典中,以及 2. 为从 n -> 1 的每个节点迭代地运行 DFS。

此代码非常适合小样本图,但不适用于大图。我知道它效率低下,但有什么技巧可以让它发挥作用吗?

def reverseFileLoader():

    graph = collections.defaultdict(lambda: {'g': [], 's': False, 't': None, 'u': None })
    for line in open('/home/edd91/Documents/SCC.txt'):
        k, v = map(int, line.split())
        graph[v]['g'].append(k)

    return graph

def DFS(graph, i):
    global t
    global source
    stack = []
    seen = []
    seen.append(i)
    stack.append(i)

    while stack:
        s = stack[-1]
        j = len(graph[s]['g']) - 1
        h = 0
        while (j >= 0):
            if graph[s]['g'][j] not in seen and graph[graph[s]['g'][j]]['t'] == None:
                seen.append(graph[s]['g'][j])
                stack.append(graph[s]['g'][j])
                h += 1
            j -= 1

        if h == 0:
            if graph[s]['t'] == None:
                t += 1
                graph[s]['u'] = source
                graph[s]['t'] = t 
            stack.pop()

def DFSLoop(graph):
    global t
    t = 0
    global source
    source = None
    i = len(graph)
    while (i >= 1):
        print "running for " + str(i)
        source = i
        DFS(graph, i)
        i -= 1

【问题讨论】:

    标签: python graph graph-algorithm depth-first-search


    【解决方案1】:

    Kosaraju 的算法可能要求检查一个元素是否已被看到是一个 O(1) 操作。但是你看到的数据结构有 O(n) 时间的成员资格测试。将seen 从列表转换为集合可以在几秒钟内在我的系统上执行代码(在删除占用大部分剩余执行时间的打印之后)。

    为了完整起见,您需要进行的更改是

    • seen = [] 更改为seen = set()
    • 将每个seen.append(...) 更改为seen.add(...)

    【讨论】:

    • 谢谢@trevor-merrifield !如此小的更改使代码运行,这不是很神奇吗,这太有帮助了。我假设一个集合以某种方式被散列?
    • 是的,源代码setobject.h setobject.c 表明它就像一个没有值的哈希表。因此 O(1)-ish 查找时间。
    猜你喜欢
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 2019-12-01
    相关资源
    最近更新 更多