当前位置: 首页 > 知识库问答 >
问题:

连通分量计数算法的运行时间

韩梓
2023-03-14

利用广度优先搜索或深度优先搜索,在线性时间内(根据图的顶点和边的个数)计算图的连通分量是很简单的。在任何一种情况下,从某个特定顶点v开始的搜索都将在返回之前找到包含v(不再包含)的整个连通组件。若要找到图的所有连通分量,请循环遍历图的顶点,每当循环到达以前发现的连通分量中尚未包含的顶点时,就开始新的广度优先或深度优先搜索。

这个操作的运行时间是多少?我遇到过一些消息来源,说连接的组件是在O(n)时间内完成的。然而,据我所知,在最坏的情况下,每个顶点都是它自己的连通分量,这个算法将不得不执行n个DFS/BFS操作,每个操作本身都是O(n)时间。因此,它的运行时不应该是O(n^2)吗?

共有1个答案

吉鸿宝
2023-03-14

首先,使用DFS或BFS遍历单个连通组件G(V,E)具有V顶点和E边具有O(V+E)复杂性。

线性时间(用图的顶点和边的个数表示)

假设图G(V,E)K连通的组件。

G(V, E) = G1(V1, E1) ∪ G2(V2, E2) ∪ ... ∪ Gk(Vk, Ek)
O(|V1|+|E1|) + O(|V2|+|E2|) + ... + O(|Vk|+|Ek|) + O(|V|)
|V| = |V1| + |V2| + ... + |Vk|
|E| = |E1| + |E2| + ... + |Ek|
O(|V1|+|E1|) + O(|V2|+|E2|) + ... + O(|Vk|+|Ek|) + O(|V|) =
O(|V1|+|V2|+...+|Vk| + |E1|+|E2|+...+|Ek|) + O(|V|) =
O(|V|+|E|) + O(|V|) =
O(|V|+|E|)
 类似资料:
  • 我被要求为这个问题编写一个算法:给我们一个数组A,我们想知道数组中是否有两个元素U和L,U和L=K 我是这样写我的算法的: 但问题是,这个算法的运行时间是多少?它是O(nlogn)吗?如果是,为什么?如果不是,我如何在O(nlogn)中实现它?

  • 本文向大家介绍Python计算程序运行时间的方法,包括了Python计算程序运行时间的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python计算程序运行时间的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 我在读算法介绍。在22.5强连接组件中,算法强连接组件(G)定义为: 调用DFS(G)计算每个顶点u的完成时间u.f 计算G转置 调用DFS(G转置),但在DFS的主循环中,按U.F递减的顺序考虑顶点(如第1行所计算) 将第3行中形成的深度优先森林中每棵树的顶点输出为一个单独的强连通分量 如果我把alogrithm改为只使用G,而不计算G转置。还要考虑按U.F增加的顺序(拓扑排序的逆序)排列的顶点

  • 如果您不知道SCC算法是如何工作的,请阅读本文:https://www.hackerearth.com/practice/algorithms/graphs/strong-connected-components/tutorial/(这是我能找到的最好的文章)。 在找到每个节点的完成时间后,将原图反转,从时间最高的节点开始运行DFS。如果我们从原始图中最小的节点开始运行DFS呢?为什么不管用?

  • 可能的重复: 如何测量函数的运行时间? 我有一种I/O计时方法,它将数据从一个位置复制到另一个位置。计算执行时间的最佳和最真实的方法是什么<代码>线程<代码>定时器<代码>秒表?还有其他解决方案吗?我想要最准确的,尽可能简短的。

  • 输出应该如下所示: 我甚至不知道为什么会有这样的错误。我将代码从https://www.geeksforgeeks.org/tarjan-algorithm-find-strong-connected-components/改为我的代码,并添加了input机会。我问过这个问题,一个朋友说:“这是addEdge方法中添加w后的两个代码的输出,在您的代码中w添加到所有元素中,而在原始代码中只添加到图V