递归函数使用的全局变量

时间:2011-12-25 21:12:04

标签: graph global-variables depth-first-search

假设您必须使用dfs(深度优先搜索)实现包含一些算法的Graph类。例如,它可能是连接检查,Graph类看起来像这样:

class Graph {
    void dfsConnected(int v) {
        visited[v] = true;
        //indexing over v's adjacencies and calling dfsConnected recursively
    }
    bool isConnected {
        //indexing over vertice list and calling dfsConnected
    }
}

假设我们有一堆算法,在这个类中使用dfs(每个都使用特定的dfs)。 问题是visited数组:

  • 我们可以将其定义为每个dfs的私有字段,例如visitedConnectivityvisitedTopSortingvisitedBridges等。因此,我们将在{的每个实例中拥有大量私有变量{1}}。如果每个dfs有3-4个这样的“全局”变量怎么办?
  • 我们可以将Graph作为visited的参数传递。在这种情况下,我们将在每个dfs调用上有开销。

那么,对于这个问题,最简单,最现实的解决方案是什么?当然,它不仅与图算法有关,而且我发现用dfs术语更容易解释它。

3 个答案:

答案 0 :(得分:1)

在我看来,更多的OOP方式是为每个DFS类提供一个字段visited,并让它运行自己的DFS ....

它会阻止你跟踪'我分配了什么?在哪里连接?等...“

您的DFS将更加封装,并且需要更少的数据,然后为每个dfs添加额外的参数,您必须单独维护。

这里的性能问题(在大多数情况下)忽略了可读性,maintainability通过在类本身中封装尽可能多的数据来实现。

答案 1 :(得分:0)

传递visited作为参数。没有开销!

更新确定我已经纠正了。让我说有可忽略不计的开销;)尽管如此,我还是选择在堆栈周围保留一个指针,使得一个字段/全局变量在函数外部没有意义,并且在每天完成后会占用内存。

如果您真的在意,可以将DFS封装在具有自己的visited字段的对象中,并将图形作为参数。但即使这样,也可能转换为使用堆栈上的对象指针进行函数调用。

答案 2 :(得分:0)

你可以使用静态变量!