设N =顶点数 M =边数 有向图G.我们以邻接列表的形式存储边缘。 为清楚起见,我们假设,Oi是顶点i的outdegree,Ii是顶点i的in-degree。
算法如下:
for each vertex i
for each vertex j in i's adj.list
//do some work
for each vertex k in j's adj.list
//do some work
“做一些工作”基本上是在恒定时间内完成的(O(1))。我无法在N,M中得出运行时间的一般表达式。有人可以解释如何做到这一点吗?
暂且不说: 为了防止“我不会做你的功课”评论,我正在练习来自CLRS的文本问题(这是22.1-5)。我这样做是为了学习如何估计图算法的时间复杂度。
答案 0 :(得分:1)
我假设算法中提到的每个邻接列表都是一个传出边列表。如果引用传入和传出边缘,则总工作量将乘以常数因子4,而不影响O()水平。
将for
语句称为F1,F2,F3,我们有F1循环N次。 F2循环总共O1+O2+... = M
次,其中Oi
是问题中提到的传出边缘度。 F3每F2通道最多循环N次,最坏情况下的下限不小。这导致算法的O(M·N)时间(即,F1和F2的O(M),每F3的O(N))。