我试图弄清楚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来解决这个问题吗?
感谢。
答案 0 :(得分:3)
O符号将乘法常数“减少”为1,因此O(2m + n)减少到O(m + n)。