我对DFS的运行时间有疑问。我知道它的O(n + m),但根据维基百科,还有另一个运行时间:O(b ^ d)。这两者有什么不同,或者是相同的表现形式。
这是在维基百科上写的:“O(| E |)表示没有重复的显式图,O(b ^ d)表示隐式图”
答案 0 :(得分:0)
您在典型算法类中使用的大多数工具都是 explicit 图,但是这些图可能不是现实世界中常见的。
对于这些显式图,深度优先搜索的运行时间为 O(V + E)(或O(n + m),相同);在此,V表示图形中的顶点数,E表示图形中的边数。这在直觉上应该是有道理的,因为深度优先搜索是用于以深度优先搜索方式遍历整个图的遍历算法,在遍历遍历算法的死胡同之后,我们会回溯。好的,但这是简单的部分。
您不习惯看到的怪异部分是DFS的隐式图表示。根据维基百科目前的说法,当涉及搜索算法时,“隐式图可以定义为一组规则,以定义任何指定顶点的所有邻居”。这可以在文章的邻里表示部分中看到。隐式图只是简单地隐式定义,可以是无限的或非常大的,而显式图是有限的并且事先给出。隐式图非常适合搜索特定深度,这就是我接下来要讲的内容。
https://en.wikipedia.org/wiki/Implicit_graph
现在,我们对隐式图本身有一个基本的了解,我们可以讨论一下您所看到的DFS的运行时间。对于DFS,当我们说隐式图的运行时间为 O(b ^ d)时,请意识到DFS算法本身的工作方式几乎相同。
在此,“ b”代表分支因子,“ d”代表深度级别。我们只希望算法仅达到某个深度级别。 Facebook寻求共同朋友的方法可能就是一个很好的例子。如果我们想要我们的直接朋友,则深度级别将为1。如果我们想要我们的朋友的朋友,深度级别将为2。Rubik的多维数据集难题还可以用作DFS遍历的“隐式图”,具体取决于多维数据集的当前状态和将来可能的移动。国际象棋也是一个很好的例子。
说 O(V + E)是隐式图的正确上限,但是我们可以用 O(b ^ d)边界更精确地指出对于隐式图,我们实质上仅将DFS应用于一定深度。由于隐式图是很大甚至是无限的,这对于为什么我们不想要纯O(V + E)的例子应该是有道理的。