Как я могу избавиться от этой проблемы переполнения стека в python для алгоритма Косараджу?

Я новый программист и прохожу Стэнфордский курс алгоритмов на edX.

Одно из заданий программирования - найти компоненты сильной связности с использованием алгоритма Косараджу на графе с ~1000 000 вершин. Моя реализация - это самый простой перевод псевдокода учебника на Python, и он отлично работает на небольших графиках, поэтому я считаю, что это правильно.

С лимитом рекурсии Python по умолчанию 1000, он достигает предела.

я пытался sys.setrecursionlimit(1000000), но это не помогает, и вместо этого я получаю сообщение "Процесс завершен с кодом выхода -1073741571", что является переполнением стека.

Я нашел эти две страницы для увеличения пределов размера стека, но не уверен, как их использовать: Установить размер стека, команда ulimit.

Еще одна важная информация заключается в том, что Python не оптимизирует хвостовую рекурсию, но я не уверен, что это применимо к моему коду в нынешнем виде.

G = {}
for i in range(1, 875715):
    G[i] = [0]
for l in open('SCC.txt'):
    items = list(map(int, l.split()))
    G[items[0]].append(items[1])

Grev = {}
for i in range(1, 875715):
    Grev[i] = [0]
for l in open('SCC.txt'):
    items = list(map(int, l.split()))
    Grev[items[1]].append(items[0])

def TopoSort(G):
    for v in G:
        if G[v][0] == 0:
            DFStopo(G, v)

def DFStopo(G, s):
    G[s][0] = 1
    global orderedVertexList
    for v in G[s][1:]:
        if G[v][0] == 0:
            DFStopo(G, v)
    orderedVertexList.insert(0, s)

def Kosaraju(G, Grev):
    TopoSort(Grev)
    global numSCC
    for v in orderedVertexList:
        if G[v][0] == 0:
            numSCC = numSCC + 1
            DFSSCC(G, v)

def DFSSCC(G, s):
    G[s][0] = 1
    global SCC
    SCC.append(numSCC)
    for v in G[s][1:]:
        if G[v][0] == 0:
            DFSSCC(G, v)

numSCC = 0
orderedVertexList = []
SCC = []

Kosaraju(copy.deepcopy(G), copy.deepcopy(Grev))

0 ответов

Другие вопросы по тегам