这是我检查给定图形是否为树(BFS)的代码。问题是,当我使用堆栈 S 时,它不会在logSpace中。虽然经过一些参考,我想我必须用一些计数器替换堆栈S,但是怎么样?有没有办法修改这个算法在LogSpace中运行?
boolean isTree(G){
Given: G=(V,E)
pick first node s
mark s as visited
S is empty stack << (Problem-I)
S.push(v)
while( S is not empty)
v = S.pop()
for all neighbors W of v in G
//check if marked as already visited
if(W is not parent of v && W is visited)
return 0
else
mark W as a visited
S.push(W)
end for
end while
return true
}
答案 0 :(得分:1)
你没有考虑visited
标志的空间,所以我假设你正在使用一些带有BitSet
的位屏蔽属性的数据结构visited
。
只有当树平衡时,O(logn)
是节点的总数(树的最大高度不会超过n
,否则堆栈将占用logn
空间节点)。在最坏的情况下,当树是平的(仅在左侧或仅在右侧生长)时,空间复杂度将为O(n)
。因此,除非树肯定是一棵平衡的树,否则不能保证对数空间。
此外,您假设给定的图形已连接。但是如果给定的图形图形没有连接,这可以变成森林(许多树木)。因此,您需要检查每个节点而不是pick first node s
,如果在第一轮之后发现任何节点未访问,则不是树,它是林/非树图。
希望它有所帮助!
有没有办法在不使用堆栈的情况下跟踪节点?
没有堆栈,要么你需要做递归/ DFS,在最坏的情况下会占用O(n)
空间的函数堆栈,或者你可以使用Queue / BFS再次占用O(n)
空间。所以不,当树是任意的(不保证平衡)时,你需要至少O(n)
空间。
您可以使用Java和/或C ++ here检查实现。