Algorithm 图算法的运行时间

Algorithm 图算法的运行时间,algorithm,graph,big-o,vertices,edges,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 o

我对如何确定图形算法的运行时间有点困惑。即,使用顶点数(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次

最后一个不那么琐碎的问题是,如果输入作为邻接矩阵而不是邻接列表给出,算法运行时将如何变化


我在网上找不到这方面的好资源,没有清晰简洁的例子来涵盖这一主题。如果有人能帮我创建一个,我将不胜感激:)

它对vi的每个边运行一次。由于每个边都与两个顶点关联,因此最终每个边访问两次,每个顶点访问一次。所以O(n+2m)=O(n+m)使用邻接列表


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

这难道不意味着运行时间就是2米吗?n在哪里起作用呢?毕竟,除了内环,外环内部没有其他操作。假设一个图有n个顶点,没有边。运行时间仍然是O(n)。O(n+m)实际上意味着O(max(n,m)),所以我从中得到的是,我们需要考虑算法总共访问了每个边/顶点多少次。谢谢。@Musicode:对于这样的循环,最好先计算循环中不同变量绑定的集合,然后论证每个值的组合只会出现固定的次数。在这种情况下,变量(vi,vj)的每一对值对应于图形中的一条边,并且您只访问每条边两次