据报告,以下算法的时间复杂度为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),这是不正确的。
答案 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]
}