Как я могу избавиться от этой проблемы переполнения стека в 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))