图算法的运行时间

时间:2014-03-15 21:50:03

标签: algorithm graph big-o vertices edges

我对如何确定图算法的运行时间感到有些困惑。即,使用顶点数(n)和边数(m)确定估计的运行时间。有人介意向我解释我的逻辑存在缺陷的地方,并解释如何正确分析这些并找出运行时间吗?

以下是一个示例图算法:

//input: Directed graph G represented by adjacency lists.
Func1(G) {
k = 0;
foreach vertex vi in V(G) do
    foreach directed edge (vi, vj) incident on vi do
    k=k+1; //just some constant time operation
    end
end
return(k);
}

该图算法的运行时间以BigO表示法给出为O(m + n)。现在这是我的问题:

只是看一下这个算法进行快速心理分析,为什么运行时间不等于O(n * m)?外循环运行n次,换句话说,每个顶点运行一次。现在内部循环对每个边缘运行一次,m次。因此,我认为两个循环一起运行n * m次。

最后一个不太重要的问题是,如果输入作为邻接矩阵而不是邻接列表,算法运行时间如何变化?

我无法在网上找到一个好的资源,没有明确和简洁的例子涵盖这个主题。如果有人可以帮我创建一个,我真的很感激:)

1 个答案:

答案 0 :(得分:2)

对于vi的每个边缘事件都会运行一次。当每个边缘入射到2个顶点时,最后,每个边缘被访问两次,每个顶点被访问一次。所以O(n + 2m)= O(n + m)使用邻接表。

使用邻接矩阵,找出哪些边缘与vi有关,你需要进行O(n)运算。所以算法是O(n²)。