计算大O时间复杂度

时间:2019-08-31 00:30:41

标签: algorithm graph time-complexity

据报告,以下算法的时间复杂度为O(v + e),但我不知道为什么。任何帮助表示赞赏。

这是问题所在:在加权的(节点和边)有向无环图中,为每个顶点计算一个称为Rank的属性。它是通过自下而上遍历图来计算的。对于出口节点,假设Rank值等于其分配的权重。对于图中的任何其他节点,排名定义为:

“节点的主要后继者的等级” +“节点与其主要后继者之间的边缘权重” +“节点的权重”

其中节点的主要后继者是具有最高Rank值的节点。

我猜这是算法的伪代码:

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

按照正确的拓扑顺序选择节点,外循环将精确执行v次,从而导致O(v)时间复杂性。 内循环(搜索后继者)最多执行(v-1)次(我猜是在使用邻接矩阵的情况下),从而导致O(v)时间复杂度。 因此,我计算了总时间复杂度O(v ^ 2),根据报告的值为O(v + e),这是不正确的。

1 个答案:

答案 0 :(得分:2)

如果使用邻接表而不是邻接矩阵,则它的值为O(V + E)。因为您只访问一次每个节点(因为您要跟踪访问过的节点),并且还访问一次每个边缘(因为您将不会使用在另一端具有访问节点的边缘)。 / p>

这是一些伪代码-

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]
}