如果我使用的话,我想知道BFS的时间复杂度是多少:
它们的空间复杂度是否相同?
答案 0 :(得分:11)
使用邻接矩阵实现的BFS的复杂性将是O(| V | 2 )。并且当由邻接列表实现时O(|V| + |E|)
。
为什么在Adjacency Matrix中更多?
这主要是因为每次我们想要找到与给定顶点'U'相邻的边时,我们必须遍历整个数组AdjacencyMatrix[U]
,这是不合适的|V|
}。
想象一下BFS作为前沿发展。你得到一个起始顶点S
,它位于0
级。所有相邻顶点都在1
级。然后,我们将级别为1的所有顶点的所有相邻顶点标记为级别2
,这些顶点没有级别。因此,每个顶点仅属于一个边界(或级别)。当一个元素在边界时,我们检查一次它的相邻顶点,这需要O(| V |)时间。因为,边界覆盖| V |在算法过程中的元素,总时间将变为O(| V | * | V |),即O(| V | 2 )。
当由邻接列表和矩阵实现时BFS的复杂度差异是由于这样的事实:在邻接矩阵中,为了告知哪些节点与给定顶点相邻,我们采用O(| V |)时间,而不考虑边缘。然而,在邻接列表中,它立即可供我们使用,花费时间与相邻顶点本身成比例,这对于所有顶点的总和| V |是| E |。因此,邻接列表的BFS给出O(| V | + | E |)。
答案 1 :(得分:5)
时间复杂性必然取决于表示。
正如link所暗示的那样,时间复杂度和邻接表是O(V + E),邻接矩阵是O(V 2 )。
答案 2 :(得分:2)
首先让我们来看看时间的复杂性。如果邻接矩阵可以存储为sparse matrix,则空间复杂度将相同。稀疏矩阵实质上仅存储邻接矩阵的非零值,因此具有与邻接列表表示相同的空间复杂度,即O(| V | + | E |)
现在时间复杂了。进行BFS搜索的一种方式是简单地使用稀疏邻接矩阵,因为通常使用邻接列表表示,即O(| V | + | E |)。
在邻接矩阵上进行BFS的另一种方法是通过重复应用Y = G X来使用稀疏矩阵 - 向量乘法,其中G是稀疏邻接矩阵,X是边界上具有1s的稀疏向量。该操作基本上是G列的组合。如果执行此操作使得每个乘法花费与G的每列中访问的数据的大小和向量X中的非零的数量成比例的时间,那么时间复杂度将是也是O(| V | + | E |)。这种方法的一个优点是,通过用表示几个BFS搜索前沿的稀疏矩阵替换X,可以直接将其扩展到多个BFS搜索。有关使用稀疏矩阵的图算法实现的paper可以看到更多细节。
边缘列表通常不用于BFS,因为找到顶点的邻居是很昂贵的。
答案 3 :(得分:0)
图的不同表示形式的时间复杂度:
1。边缘列表:
边列表由列表中的所有边组成。为了进行BFS,时间复杂度为O(E^2)
。由于每个边u->v
,您必须遍历整个边列表,找到源顶点为u
的边并进行探索,然后浏览u->v
中的顶点“ v”以进行BFS。
E
是边数。
如果根据源索引和目标索引对边缘进行排序,则排序后的列表将按BFS顺序排列。只需遍历列表,您将获得BFS。
排序边缘列表的时间复杂度为O(E*log(E))
。
2。邻接列表
邻接关系是键的映射,其中每个顶点都是键,并且指向从该键顶点入射或与该键顶点相邻的顶点列表。
为了执行BFS,请将任何顶点放入队列中并使其成为已访问节点,弹出队列[0],选择起始顶点,浏览其所有相邻顶点,使其成为已访问节点并将其放入队列中,同样,弹出队列[0]并浏览所有未访问的顶点,直到队列为空。对于每个顶点,您仅遍历其相邻的未访问顶点(除了边线)。
因此,时间复杂度为O(V+E)
3。矩阵
在矩阵表示中,对于每个顶点,您都必须遍历所有顶点并检查是否存在未访问的顶点。因为对于每个顶点,我们都遍历所有顶点,
时间复杂度为O(V^2)