假设您必须使用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
数组:
visitedConnectivity
,visitedTopSorting
,visitedBridges
等。因此,我们将在{的每个实例中拥有大量私有变量{1}}。如果每个dfs有3-4个这样的“全局”变量怎么办?Graph
作为visited
的参数传递。在这种情况下,我们将在每个dfs调用上有开销。那么,对于这个问题,最简单,最现实的解决方案是什么?当然,它不仅与图算法有关,而且我发现用dfs术语更容易解释它。
答案 0 :(得分:1)
在我看来,更多的OOP方式是为每个DFS类提供一个字段visited
,并让它运行自己的DFS ....
它会阻止你跟踪'我分配了什么?在哪里连接?等...“
您的DFS将更加封装,并且需要更少的数据,然后为每个dfs添加额外的参数,您必须单独维护。
这里的性能问题(在大多数情况下)忽略了可读性,maintainability通过在类本身中封装尽可能多的数据来实现。
答案 1 :(得分:0)
传递visited
作为参数。没有开销!
更新确定我已经纠正了。让我说有可忽略不计的开销;)尽管如此,我还是选择在堆栈周围保留一个指针,使得一个字段/全局变量在函数外部没有意义,并且在每天完成后会占用内存。
如果您真的在意,可以将DFS封装在具有自己的visited
字段的对象中,并将图形作为参数。但即使这样,也可能转换为使用堆栈上的对象指针进行函数调用。
答案 2 :(得分:0)
你可以使用静态变量!