【问题标题】:C library for graphs [closed]用于图形的 C 库 [关闭]
【发布时间】: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


【解决方案1】:

我遇到了igraph 库。它是用 C 语言编写的,并且包含 Ruby、Python 和 R 的包装器。对您而言,这意味着您可以在 Ruby 的舒适度下享受 C 的速度。

【讨论】:

    【解决方案2】:

    Ruby Graph Library (RGL)(用 Ruby 编写)是一种可供考虑的选择。

    【讨论】:

    • 你知道这个库的可扩展性吗?由于我也在 Ruby 中实现了相同的算法,并且遇到了问题,我担心这个库也是用 Ruby 编写的。可能有一种方法可以避免我遇到的问题。我不知道。
    • @sawa:我不知道它的可扩展性。
    【解决方案3】:

    在 C++ 中有 CXXGraph Library,这是一个仅用于图形操作和算法的标头库。

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2012-11-06
      相关资源
      最近更新 更多