下面的算法的时间复杂度被报告为O(V+E),但我不知道为什么。如有任何帮助,我们将不胜感激。
这就是问题所在:在一个加权(节点和边)有向无环图中,每个顶点都计算一个称为秩的属性。它是通过自下而上遍历图形来计算的对于退出节点,假定秩值等于其分配的权重。对于图中的任何其他节点,秩定义为:
“节点的主要继承者的等级”+“节点与其主要继承者之间的边的宽度”+“节点的权重”
其中,节点的主要继承者是具有最高秩值的继承者。
我猜这个算法的伪代码是:

     For "every vertex" in the graph
        For "every immediate successor" of the selected vertex
           [the statements ...]
        End
     End

选择正确的拓扑顺序中的节点,外环精确执行V次,导致O(V)时间复杂度。
内部循环(搜索后继)最多执行(30次)(在使用邻接矩阵的情况下),导致O(v)时间复杂度。
因此,我计算的总时间复杂度O(v^ 2),这是不正确的,根据所报告的值是O(V+E)。

最佳答案

如果使用邻接列表而不是邻接矩阵,则需要O(V+E)。因为您只访问了每个节点一次(因为您正在跟踪访问的节点),而且还访问了每个边缘一次(因为您不会使用另一端有已访问节点的边缘)。
这是一些伪代码-

queue<Node> q;
startNode = (starting node)
bool[numNodes] visited;
while (visited.size() < numNodes) {
    [check if visited]
    [mark as visited]
    [set rank]
    [add successors to the queue if they're not visited]
}

07-25 21:06
查看更多