伪代码的摊销时间复杂度分析

Amortized Time Complexity Analysis of the pseudocode

伪代码:

for level_t in BFS_tree:
    for node1 in level_{t}:
        for node2 in level_{t-1}:
            Do operation

我应该计算这段代码的顺序。这是我目前的想法。
外层循环是线性顺序(在 |G| 上)循环。中间循环是 n^2 阶循环。同样是最内层的循环。
现在我不能继续将这一切相乘,因为中间循环不是所有级别的 n^2。 因此,让 Ai 表示每个级别,Bi 表示中间循环的级别中的节点数,Ci 表示最内层循环的每个级别中的节点数。

A​​i 上的求和是n。 Bi 上的求和是 n^2。 Ci 的总和是 n^2。我需要 AiBiCi.

的求和

我应该如何继续执行此操作?我考虑过使用 AM/GM 不等式,但求和不会拆分为乘积。

如果您需要更多信息,请告诉我。提前致谢。

我认为分析此代码最有帮助的方法不是计算循环并将它们相乘,而是查看代码的作用并使用它来计算运行时。

前两个循环统称为“遍历树中的每个节点”,对于每个节点,内循环表示“遍历节点的 children”。这意味着我们

  • 访问每个节点,并且
  • 在那个节点做与其度数成比例的工作(children 的数量)。

总的来说,这意味着完成的总工作量受限于树中所有节点的度数之和。计算结果为 O(n),其中 n 是树中的节点数,与树的形状无关。几种查看方式:

  1. 有向图中所有节点的度之和等于图中的边数,n个节点的树恰好有n-1条边。
  2. 假设我们在给定节点上执行 k 个工作单元。这意味着该节点有 k children。将一个工作单元推送给每个 children。由于每个节点只有一个 parent 节点,每个节点(根节点除外)在我们完成后都有一个工作单元,因此完成的总工作量为 O(n)。
  3. 您上面给出的伪代码等同于 运行 树上 BFS 的伪代码。 运行 BFS 在树上花费时间 O(n)。