2012-04-14 25 views
3

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.

+1

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

+0

@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

+0

Tut mir leid, ich habe keine Ahnung. Ich habe Ruby kaum benutzt. – Michael

Antwort

2

Ich stieß auf die igraph Bibliothek. Es ist in C geschrieben und hat Wrapper für Ruby, Python und R. Für Sie bedeutet das, dass Sie die Geschwindigkeit von C mit dem Komfort von Ruby genießen können.

1

Ruby Graph Library (RGL) (in Ruby geschrieben) ist eine Option zu prüfen.

+0

Haben Sie eine Vorstellung von der Skalierbarkeit dieser Bibliothek? Da ich auch den gleichen Algorithmus in Ruby implementiert habe und ein Problem hatte, mache ich mir Sorgen, dass diese Bibliothek auch in Ruby geschrieben ist. Es könnte sein, dass es einen Weg gibt, die Probleme, die ich hatte, zu vermeiden. Ich weiß es nicht. – sawa

+0

@sawa: Ich weiß nicht über seine Skalierbarkeit. –