Graph 递归函数使用的全局变量

Graph 递归函数使用的全局变量,graph,global-variables,depth-first-search,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 { //ind

假设您必须使用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)。 问题是
已访问
阵列:

  • 我们可以将其定义为每个dfs的私有字段,如
    visitedConnectivity
    visitedTopSorting
    visitedBridges
    ,等等。因此,
    Graph
    的每个实例中都有许多私有变量。如果每个dfs都有3-4个这样的“全局”变量呢
  • 我们可以将
    visted
    作为
    dfs
    的参数传递。在这种情况下,每个dfs调用都会有开销

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

作为参数传递。没有开销

更新确定我站更正。让我说,有可忽略的间接费用;)尽管如此,我还是会选择在堆栈中保留一个指针,而不是在函数外使用一个毫无意义的字段/全局变量,并在每天完成后消耗内存


如果您真的在意,您可以将DFS封装在一个对象中,该对象有自己的
访问
字段,并将图形作为参数。但即便如此,这也可能转化为堆栈上带有对象指针的函数调用。

作为参数传递。没有开销

更新确定我站更正。让我说,有可忽略的间接费用;)尽管如此,我还是会选择在堆栈中保留一个指针,而不是在函数外使用一个毫无意义的字段/全局变量,并在每天完成后消耗内存


如果您真的在意,您可以将DFS封装在一个对象中,该对象有自己的
访问
字段,并将图形作为参数。但即使这样,也可能转化为堆栈上带有对象指针的函数调用。

您可以使用静态变量

您可以使用静态变量

在我看来,更为面向对象的方法是为每个DFS类创建一个字段
访问
,并使其运行自己的DFS

这将阻止您跟踪“我分配了什么?”?它连接到哪里?等等……”

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


这里的性能问题[在大多数情况下]对于可读性来说被忽略了,您可以通过在类本身中封装尽可能多的数据来实现。

在我看来,更面向对象的方法是为每个DFS类删除一个访问的字段
,并使其运行自己的DFS

它将阻止您跟踪“我分配了什么?它连接到哪里?等等…”

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


这里的性能问题[在大多数情况下]对于可读性来说被忽略了,您通过在类本身中封装尽可能多的数据来实现。

为什么说没有开销?如果访问的是一个
向量
,它将被复制-这会带来开销。如果它是一个数组,这并不能解决问题,因为它只能通过引用传递。你能解释一下你对这个答案的逻辑吗?我想通过引用来传递。为什么这不能解决问题?有。每次调用时,访问的
指针将存储在调用堆栈中。我想任何好的编译器都会优化作为常量ref传递的不变值,并将其存储在寄存器中。如果有疑问,请检查已编译函数的汇编输出,并查看它的功能。另外,在进行大量预优化之前进行测量。你为什么说没有开销?如果访问的是一个
向量
,它将被复制-这会带来开销。如果它是一个数组,这并不能解决问题,因为它只能通过引用传递。你能解释一下你对这个答案的逻辑吗?我想通过引用来传递。为什么这不能解决问题?有。每次调用时,访问的
指针将存储在调用堆栈中。我想任何好的编译器都会优化作为常量ref传递的不变值,并将其存储在寄存器中。如果有疑问,请检查已编译函数的汇编输出,并查看它的功能。另外,在进行大量预优化之前进行测量。它们会有什么帮助?你能详细说明一下吗?他们会有什么帮助?你能详细说明一下吗?