【问题标题】:Amortized Time Calculation in AVL treeAVL 树中的摊销时间计算
【发布时间】:2020-12-15 21:52:54
【问题描述】:

我的教授在课堂上展示了以下问题,并提到答案是 O(1),而我的完全不同,我希望得到一些帮助,知道我犯了什么错误。

问题:

计算 AVL 树中 F 方法的 摊销时间复杂度,当我们从最小节点开始并且每次调用 F 超过最后找到的成员时。

F的描述:当我们在特定的节点F时,就像从当前节点开始的中序遍历一样,一直到下一个节点,按顺序遍历下一次调用。


我做了什么:

首先,我对 F 进行了一系列随机的 m 次调用。

我说对于第一个我们需要 O(log n) - 找到最小的节点然后对于下一个节点我们需要再次做 inorder 但继续一个步骤所以 O(log n)+1 以此类推直到我扫描 m 个元素。

这让我:

为了计算摊销时间,我们做 T(m)/m 然后我得到:

肯定不是 O(1)。

【问题讨论】:

    标签: algorithm time-complexity avl-tree tree-traversal amortized-analysis


    【解决方案1】:

    该算法不是从搜索任何节点开始的,而是已经传递了一个节点并将从该节点开始。例如。 F 的伪代码如下所示:

    F(n):
         if n has right child
             n = right child of n
    
             while n has left child
                 n = left child of n
    
             return n
         else
             prev = n
             cur = parent of n
             while prev is right child of cur and cur is not root
                 prev = cur
                 cur = parent of prev
    
             if cur is root and prev is right child of cur
                 error "Reached end of traversal"
             else
                 return cur
    

    上面的代码基本上是从一个节点开始按顺序遍历树,直到到达下一个节点。

    摊销运行时间:
    选择任意树和m。让r_0 成为F 访问的所有节点的最低共同祖先。现在将r_(n + 1) 定义为r_n 的右子树中所有节点的最低共同祖先,F 将返回。此递归在r_u 处触底,这将是有序遍历中的m-th 节点。在某些迭代中,F 将返回任何r_n,因此r_n 的左子树中的所有节点也将由F 返回。

    F 将访问的所有节点要么也由 F 返回,要么是从 r_0r_u 的路径上的节点。由于r_0r_1的祖先,r_1r_2的祖先等等,所以从r_0r_u的路径最多可以是右子树高。树的高度受log_phi(m + 2)的限制,所以总共最多

    m + log_phi(m + 2)
    

    Fm 迭代期间将访问节点。 F 访问的所有节点形成一个子树,因此算法将遍历最多 2 * (m + log_phi(m + 2)) 边,导致摊销运行时复杂度为

    2 * (m + log_phi(m + 2)) / m = 2 + 2 * log_phi(m + 2) / m = O(1)
    

    (上面的界限实际上要严格得多,但对于这里给出的计算来说完全足够了)

    【讨论】:

    • "算法不是从搜索任何节点开始,而是已经传递了一个节点,将从那个节点开始"你是怎么理解的?
    • @MrCalc 描述说:“我们从最小节点开始,每次我们调用 F 超过最后找到的成员。”
    • @MrCalc 抱歉,忘记了return-statement 和附加条件。无论如何,代码现在可以工作了。
    • @MrCalc 不要将该代码过于字面化。如果您的 AVL 树的实现不提供父指针,则只需使用堆栈来跟踪父节点。
    • @MrCalc 好吧,诀窍是我们可以简单地选择一个包含我们将选择的所有 m 节点的任意子树,上面的分析给出了 m 节点的摊销运行时间。我只是隐含了几个步骤,但分析是正确的。
    猜你喜欢
    • 2018-10-15
    • 2013-01-23
    • 1970-01-01
    • 2018-03-11
    • 2010-09-17
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多