2012-04-14 13 views
3

グラフ理論操作のための良いCライブラリはありますか?特に、有向グラフのstrongly connected componentsを計算する必要があります。グラフのCライブラリ

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 

をし、それが小さなグラフで働いていたが、グラフは大きな成長するにつれ、それはメソッドの再帰呼び出しによる「スタックレベルが深すぎ」エラーを返すために始めたstrong_connect次のように私はRubyでTarjan's algorithmを実装しています。私はCライブラリが必要で、メインプログラムが書かれているRubyからアクセスする必要があると思います。

ライブラリに加えて、それをRubyライブラリで使用することをお勧めします。

+1

cにする必要がありますか?私は[Boost Graph Library](http://www.boost.org/doc/libs/1_49_0/libs/graph/doc/index.html)にあなたがC++でOKならば行く方法だと言われました。 。 – Michael

+0

@MichaelそれはRubyから呼び出せる限りは問題ありません。 Rubyを他の言語で拡張することに慣れていません。 Rubyから呼び出す方法はありますか? – sawa

+0

申し訳ありませんが、わかりません。私はほとんどRubyをまったく使用していません。 – Michael

答えて

2

私はigraphライブラリを見つけました。これはC言語で書かれており、Ruby、Python、Rのラッパーを持っています。これは、Rubyの快適さでCの速度を楽しむことができるということです。

1

Ruby Graph Library (RGL)(Rubyで書かれています)は考慮する1つのオプションです。

+0

このライブラリのスケーラビリティについてご存じですか?私もRubyで同じアルゴリズムを実装していて問題があったので、このライブラリもRubyでも書かれているのではないかと心配しています。私が持っていた問題を避ける方法があるかもしれません。知りません。 – sawa

+0

@sawa:スケーラビリティについてはわかりません。 –