【问题标题】:Prove the efficiency of repeated calls to successor() in binary trees?证明在二叉树中重复调用 successor() 的效率?
【发布时间】:2011-12-10 06:00:06
【问题描述】:

我需要 CLRS 算法一书中关于这个练习的提示:

证明无论我们从高度为 h 的二叉搜索树中的哪个节点开始,k 次对 Tree-Successor 的连续调用都需要 O(k+h) 时间.

【问题讨论】:

    标签: algorithm binary-search-tree proof


    【解决方案1】:
    • k 连续调用TREE-SUCCESSOR 之后,让x 成为起始节点,z 成为结束节点。
    • p 成为xz 之间的简单路径。
    • y 成为p 访问的xz 的共同祖先。
    • p的长度最多为2h,即O(h)
    • output 是其值介于x.keyz.key 之间的元素。
    • output 的大小为O(k)
    • 在执行k 对TREE-SUCCESSOR 的连续调用时, 访问p 中的节点, 除了节点xyz, 如果访问p 中某个节点的子树,则其所有元素都在output 中。
    • 所以运行时间是O(h+k)

    【讨论】:

    • In the execution of k successive calls to TREE-SUCCESSOR, the nodes that are in p are visited, and besides the nodes x, y and z 你能解释一下这里的y 是什么吗?
    • 我在答案中添加了y
    • @AviCohen。非常感谢你。所以,我认为k 连续调用意味着调用查找后继函数k 次意味着我们将拥有k 不同的函数,每个函数都有自己的递归调用。我想,既然为每个人寻找继任者需要O(h),其中h是高度,那么我们需要O(h)+...+O(h)k次? P
    【解决方案2】:

    提示:做一个小例子,观察结果,尝试推断原因。

    要开始,这里有一些事情需要考虑。

    从某个节点开始,对 Tree-Succcesor 的 k 次连续调用构成了部分树遍历。这次步行访问了多少(至少和最多)节点? (提示:想想key(x))。请记住,一条边最多被访问两次(为什么?)。

    最后提示:结果是O(2h+k)

    【讨论】:

    • 一个节点最多被访问三次。
    猜你喜欢
    • 2014-12-07
    • 2019-03-12
    • 2011-03-24
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多