Data structures BFS的时间复杂度取决于图的表示形式?

Data structures BFS的时间复杂度取决于图的表示形式?,data-structures,graph,graph-algorithm,breadth-first-search,Data Structures,Graph,Graph Algorithm,Breadth First Search,我想知道BFS的时间复杂度是多少,如果我使用: 邻接矩阵 邻接表 边缘列表 它与它们的空间复杂度相同吗?时间复杂度必然取决于表示 这表明,具有和邻接列表的时间复杂度为O(V+E),具有邻接矩阵的时间复杂度为O(V2)。使用邻接矩阵实现的BFS的复杂度将为O(| V |²)。当通过邻接列表实现时,是O(|V|+|E|) 为什么它更多的是在邻接矩阵的情况下 这主要是因为每次我们想要找到与给定顶点“U”相邻的边时,我们都必须遍历整个数组邻接矩阵[U],这当然是长度|V | 想象一下BFS作为前沿的

我想知道BFS的时间复杂度是多少,如果我使用:

  • 邻接矩阵
  • 邻接表
  • 边缘列表

它与它们的空间复杂度相同吗?

时间复杂度必然取决于表示


这表明,具有和邻接列表的时间复杂度为O(V+E),具有邻接矩阵的时间复杂度为O(V2)。

使用邻接矩阵实现的BFS的复杂度将为
O(| V |²)
。当通过邻接列表实现时,是
O(|V|+|E|)

为什么它更多的是在邻接矩阵的情况下

这主要是因为每次我们想要找到与给定顶点“U”相邻的边时,我们都必须遍历整个数组
邻接矩阵[U]
,这当然是长度
|V |

想象一下BFS作为前沿的发展。获取一个起始顶点
S
,该顶点位于级别
0
。与
S
相邻的所有顶点将位于级别
1
。然后,我们将级别1上没有级别的所有顶点的所有相邻顶点标记为级别
2
。因此,每个顶点将只属于一个边界。每一个边界对应不同的层次。当一个元素在边界中时,我们检查一次它的相邻顶点,这需要
O(| V |)
时间。由于边界在算法过程中覆盖了
| V |
元素,因此总时间将变成
O(| V |*| V |)
,也就是
O(| V | |)


当通过邻接列表和矩阵实现时,BFS的复杂度差异是由于在邻接矩阵中,为了确定哪些节点与给定顶点相邻,我们采用
O(| V |)
时间,而不考虑边的数量。然而,在邻接列表中,我们可以立即使用的边,因此它所需的时间与相邻顶点的数量成比例,所有顶点的总和| V |是| E |。因此,BFS按邻接列表给出O(|V |+|E |)。

首先让我们看看时间复杂性。如果邻接矩阵可以存储为,那么空间复杂度将是相同的。稀疏矩阵本质上只存储邻接矩阵的非零值,因此具有与邻接列表表示相同的空间复杂度,即O(| V |+| e |)

现在来谈谈时间复杂性。执行BFS搜索的一种方法是简单地使用稀疏邻接矩阵,就像通常使用邻接列表表示一样,即O(| V |+| e |)

对邻接矩阵执行BFS的另一种方法是通过重复应用Y=gx使用稀疏矩阵向量乘法,其中G是稀疏邻接矩阵,X是边界上有1s的稀疏向量。此操作基本上是G列的组合。如果实现此操作时,每次乘法所需的时间与G列中访问的数据大小和向量X中的非零数成比例,则时间复杂度也将为O(| V |+| E |)。这种方法的一个优点是,通过用表示多个BFS搜索边界的稀疏矩阵替换X,可以直接将其扩展到多个BFS搜索。关于使用稀疏矩阵的图算法的实现,可以在本文中看到更多细节


边列表通常不用于BFS,因为查找顶点的邻域代价很高。

不同图形表示的时间复杂性:

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)

,但我们不能在每个列表中有| V |-1个邻接项,这样它就会变成O(| V | ^2)?是的,它确实变成了O(| V | ^2),但这只是写O(| V |+| E |)的另一种方式。。。怎样。。??当每个顶点有| V |-1个相邻顶点时,你的| E |在O(| V | ^2)。。。。所以在这种情况下,术语O(|V |+| E |)变成,O(|V |+| V | ^2)。。。也就是O(| V |^2)。:)