BFS如何在邻接矩阵列表O(m + n)上?

时间:2011-12-22 18:06:57

标签: breadth-first-search adjacency-list adjacency-matrix

我试图弄清楚BFS是如何O(m + n),其中n是顶点数,m是边数。

算法是:

public void bfs()
{
    //BFS uses Queue data structure
    Queue q=new LinkedList();
    q.add(this.rootNode);
    printNode(this.rootNode);
    rootNode.visited=true;
    while(!q.isEmpty())
    {
        Node n=(Node)q.remove();
        Node child=null;
        while((child=getUnvisitedChildNode(n))!=null)
        {
            child.visited=true;
            printNode(child);
            q.add(child);
        }
    }
    //Clear visited property of nodes
    clearNodes();
}
//

在邻接列表中,我们将顶点存储在数组/散列表中,以及每个顶点与其他顶点形成的边的链表。

我的主要问题是:我们如何实现获取未访问的子节点?很明显,您将节点标记为已访问,但在遍历时,您将浏览所有链接列表,因此您将每个边缘计数两次,因此复杂度为O(2m + n)对吗?那只是向下舍入到O(m + n)吗?

另外,我们可以为邻接矩阵采用类似的策略吗?如果给出一个大小为n x n的矩阵,并且我想知道某个特定元素是否存在,我可以用BFS来解决这个问题吗?

感谢。

1 个答案:

答案 0 :(得分:3)

O符号将乘法常数“减少”为1,因此O(2m + n)减少到O(m + n)。