2012-04-14 3 views
3

그래프 이론 조작을위한 훌륭한 C 라이브러리가 있습니까? 특히 그래프의 strongly connected components을 계산해야합니다. 다음과 같이 루비에 Tarjan's algorithm을 구현 한 :그래프 용 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의 재귀 호출에 "너무 깊이 스택 레벨을"오류를 반환하기 시작 . C 라이브러리가 필요하고 Ruby에서 액세스 할 필요가 있다고 생각합니다.이 프로그램에서는 주 프로그램이 작성되었습니다.

라이브러리 외에도 Ruby 라이브러리에서이를 사용하기위한 제안이 도움이 될 것입니다.

+1

필요합니까? 나는 [Boost Graph Library] (http://www.boost.org/doc/libs/1_49_0/libs/graph/doc/index.html)가 당신이 C++로 괜찮다면 갈 길이라고 들었습니다. . – Michael

+0

@Michael Ruby에서 호출 할 수있는 한 괜찮습니다. Ruby를 다른 언어로 확장하는 것에 익숙하지 않습니다. Ruby에서 호출하는 방법을 알고 있습니까? – sawa

+0

죄송합니다, 저는 잘 모릅니다. 나는 루비를 간신히 사용했다. – Michael

답변

2

igraph 라이브러리를 발견했습니다. C로 작성되었으며 Ruby, Python 및 R에 대한 래퍼가 있습니다. 이는 Ruby의 편안함으로 C의 속도를 즐길 수 있음을 의미합니다.

1

Ruby Graph Library (RGL) (Ruby로 작성)은 고려해야 할 옵션 중 하나입니다.

+0

이 라이브러리의 확장성에 대해 알고 있습니까? 또한 Ruby에서 동일한 알고리즘을 구현하고 문제가 발생했기 때문에이 라이브러리도 Ruby로 작성되었다고 우려합니다. 내가 가진 문제를 피할 수있는 방법이있을 수 있습니다. 나는 모른다. – sawa

+0

@sawa : 확장성에 대해서는 잘 모르겠습니다. –