在LogSpace中检测给定图形是否为Tree

时间:2017-04-25 04:21:28

标签: algorithm graph tree dfs

这是我检查给定图形是否为树(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
        }

1 个答案:

答案 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检查实现。