广度优先搜索时间复杂度
Breadth First Search Time Complexity
我想问一下,为什么BFS的时间复杂度不是O(V)而是O(E+V)?
原因是要检查的元素队列最多入队V次。所以队列中最多有 V 个条目。所以enqueue最多发生V次,enqueue是bfs中出现频率最高的操作。所以顺序应该是 O(V)
扩展@beaker 的评论:
您是完全正确的,在完整的 运行 广度优先搜索中只有 O(|V|) 个节点排队,这正是您提到的原因。然而,不是这种情况,因为入队是 BFS 期间执行的最频繁的操作,所以你不能由此声称 运行 时间是 O( |V|).
在 BFS 中,每当一个节点从队列中出队时,它的每个邻居都会被扫描以查看它是否也应该被添加到队列中。这意味着,在 BFS 的整个 运行 中,每条边最多扫描一次(如果图形是有向的)或最多扫描两次(如果它是无向的,则在每个端点出队时扫描一次)。总的来说,这增加了 O(|E|) 必须完成的额外工作,这既解释了其他术语的来源,也说明了为什么主要工作不纯粹在入队和出队中。
希望对您有所帮助!
我想问一下,为什么BFS的时间复杂度不是O(V)而是O(E+V)?
原因是要检查的元素队列最多入队V次。所以队列中最多有 V 个条目。所以enqueue最多发生V次,enqueue是bfs中出现频率最高的操作。所以顺序应该是 O(V)
扩展@beaker 的评论:
您是完全正确的,在完整的 运行 广度优先搜索中只有 O(|V|) 个节点排队,这正是您提到的原因。然而,不是这种情况,因为入队是 BFS 期间执行的最频繁的操作,所以你不能由此声称 运行 时间是 O( |V|).
在 BFS 中,每当一个节点从队列中出队时,它的每个邻居都会被扫描以查看它是否也应该被添加到队列中。这意味着,在 BFS 的整个 运行 中,每条边最多扫描一次(如果图形是有向的)或最多扫描两次(如果它是无向的,则在每个端点出队时扫描一次)。总的来说,这增加了 O(|E|) 必须完成的额外工作,这既解释了其他术语的来源,也说明了为什么主要工作不纯粹在入队和出队中。
希望对您有所帮助!