【发布时间】:2012-04-14 00:14:59
【问题描述】:
是否有用于图论操作的良好 C 库?我特别需要计算有向图的strongly connected components。我在 Ruby 中实现了Tarjan's algorithm,如下所示:
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 !@indice[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 库中使用它的建议都会有所帮助。
【问题讨论】:
-
必须是c吗?有人告诉我Boost Graph Library 是如果你对 c++ 没问题的方法。
-
@Michael 只要可以从 Ruby 调用就可以了。我只是不熟悉使用其他语言扩展 Ruby。你知道如何从 Ruby 中调用它吗?
-
对不起,我不知道。我几乎没有使用过 Ruby。
标签: c ruby directed-acyclic-graphs ruby-c-extension