为什么广度优先搜索有两个列出的时间复杂度?

时间:2013-11-04 00:09:27

标签: algorithm graph big-o time-complexity breadth-first-search

Wikipedia article on breadth-first search列出了广度优先搜索图的两个时间复杂度:O(| E |)和O(b d )。不过在页面后面,它只列出了O(| E |)。

为什么有两种不同的运行时间?哪一个是正确的?

1 个答案:

答案 0 :(得分:16)

两种时间复杂度都是正确的,但在不同情况下用于测量相对于两个不同量的时间复杂度。这与广度优先搜索算法通常是指在不同上下文中使用的两种不同相关算法这一事实有关。

在一个上下文中,BFS是一种算法,给定图中的图形和起始节点,通过首先访问距离0处的所有节点,然后距离1,然后距离2等,访问从起始节点可到达的每个节点。 。直到访问所有节点。这将访问图中的每个节点,并且在这样做的过程中,最多探索一个节点和边缘最多一次(在定向情况下)或两次(在无向情况下)。通过使用队列来跟踪下一个要探索的节点并使用适当的簿记,运行时将为O(| E | + | V |)(并且通过进一步优化,它将为O(| E |))。

在不同的上下文中,BFS是一种搜索算法,用于查找从图中的某个起始节点到图中目标节点的最短路径。在这种情况下,算法一发现目标节点就会停止运行。这意味着运行时取决于目标节点距源节点的距离。该距离又取决于图的结构。如果图形密集连接,则节点不能那么远,如果图形稀疏,则节点可能非常远。在此上下文中,通常添加称为“分支因子” b 的参数,该参数描述与任何节点相邻的边的平均或最大数量。这意味着

  • 距起始节点0距离处有一个节点。
  • 距离起始节点1的距离最多只有 b 个节点。
  • 距离起始节点2的距离最多只有 b 2 节点。
  • ...
  • 距起始节点k距离最多 b k 节点。

如果我们假设目标节点距离起始节点 d ,那么BFS最多将访问b 0 + b 1 + ... + b d = O(b d )节点,每个节点花费O(b)时间。因此,总运行时间将为O(b d )。

总结:

  • 当用于探索整个图形时讨论算法时,通常使用O(| E |)的运行时。
  • O(b d )的运行时通常在讨论算法时用于查找图中的特定节点。

希望这有帮助!