Gibt es eine gute C-Bibliothek für graphentheoretische Manipulationen? Ich muss insbesondere die strongly connected components eines gerichteten Graphen berechnen. Ich habe Tarjan's algorithm in Ruby implementiert wie folgt:C-Bibliothek für Graphen
def strongly_connected_components graph
@index, @stack, @indice, @lowlink, @scc = 0, [], {}, {}, []
@graph = graph
vertices(@graph).each{|v| strong_connect(v) unless @indice[v]}
@scc
end
def strong_connect v
@indice[v] = @index
@lowlink[v] = @index
@index += 1
@stack.push(v)
@graph.each do |vv, w|
next unless vv == v
if [email protected][w]
strong_connect(w)
@lowlink[v] = [@lowlink[v], @lowlink[w]].min
elsif @stack.include?(w)
@lowlink[v] = [@lowlink[v], @indice[w]].min
end
end
if @lowlink[v] == @indice[v]
i = @stack.index(v)
@scc.push(@stack[i..-1])
@stack = @stack[0...i]
end
end
und es wurde die Arbeit mit kleinen Grafiken, aber wie der Graph groß wuchs, begann es „Stack-Ebene zu tief“ Fehler aufgrund von rekursiven Aufruf der Methode zurückzukehren strong_connect
. Ich schätze, ich brauche eine C-Bibliothek und greife auf das von Ruby, in dem das Hauptprogramm geschrieben ist.
Zusätzlich zur Bibliothek wäre jeder Vorschlag für die Verwendung in einer Ruby-Bibliothek hilfreich.
Muss es c sein? Mir wurde gesagt, dass die [Boost Graph Library] (http://www.boost.org/doc/libs/1_49_0/libs/graph/doc/index.html) der Weg ist, wenn Sie mit C++ in Ordnung sind . – Michael
@Michael Das ist in Ordnung, solange es von Ruby aus aufgerufen werden kann. Ich bin einfach nicht vertraut mit Ruby mit anderen Sprachen zu erweitern. Hast du eine Idee, wie man es von Ruby aus anruft? – sawa
Tut mir leid, ich habe keine Ahnung. Ich habe Ruby kaum benutzt. – Michael