微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

BFS的时间复杂度分析

如何解决BFS的时间复杂度分析

知道,关于BFS的时间复杂性还有很多问题,即: O(V + E)

但是我仍然很难理解为什么时间复杂度 O(V + E)而不是 O(V * E)

我知道 O(V + E)代表 O(max [V,E]),我唯一的猜测是它与图的密度,而不是算法本身,与Merge Sort不同,它的时间复杂度始终为 O(n * logn)

我想到的例子是:

  1. 具有| E |的有向图= | V | -1 ,是的,时间复杂度为 O(V)
  2. 具有| E |的有向图= | V | * | V-1 | ,而实际上复杂度分别为 O(| E |)= O(| V | * | V |)顶点除了自身之外,其他所有顶点都具有出线边缘

我的方向正确吗?任何见解都将真正有帮助。

解决方法

您的“思想实例”说明,复杂性不是 O(V * E),而是 O(E)。的确,与 V 相比, E 可以是很多,但是当您说复杂度为 O(E)时,这并不重要

连接图形后,您始终可以说它是 O(E)。在时间复杂度中包括 V 的原因是要覆盖其顶点比边缘多(因而断开连接)的图:BFS算法不仅必须访问所有边缘,而且还需要访问所有边缘。所有顶点,包括那些没有边的顶点,只是为了检测它们没有边。所以我们必须说 O(V + E)

,

如果您遍历算法,则复杂性很容易消除。设Q为FIFO队列,最初它包含源节点。 BFS基本上执行以下操作

while Q not empty
  pop u from Q
  for each adjacency v of u
     if v is not marked
         mark v
         push v into Q

由于每个节点添加一次并删除一次,因此while循环执行了O(V)次。同样,每次我们弹出u时,我们都会执行| adj [u] | | adj [u] |的操作是的数量 你的邻接。

因此,由于邻接的总和为O(E),所以总复杂度为所有V的总和(1+ | adj [u] |),即O(V + E)(对于无向图,2E;对于有向图,E一个)

,

请考虑一下当您有一棵树时的情况,即使有循环,您也要从根开始搜索,而目标是树的最后一片叶子。在这种情况下,您将遍历所有边缘,然后再到达目的地。

例如

0 - 1
1 - 2
0 - 2
0 - 3

在这种情况下,您将在实际找到3号节点之前先检查4条边。

,

这取决于邻接表的实现方式。一个正确实现的邻接表是一个顶点列表/数组,每个顶点条目都附加有相关边的列表。

关键是边缘条目直接指向其对应的顶点数组/列表条目,它们从不必须在顶点数组/列表中搜索匹配的条目,只需查找即可直。这样可确保边缘访问的总数为2E,而顶点访问的总数为V + 2E。这样总时间为O(E + V)。

在实现不正确的邻接列表中,顶点数组/列表没有直接索引,因此要从边条目到顶点条目,您必须搜索顶点列表O(V),这意味着总数时间是O(E * V)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。