【问题标题】:solution of recurrence relations of a program程序递归关系的解
【发布时间】:2017-06-09 04:37:35
【问题描述】:

我有一个测验要求我找出程序的递归关系的解决方案:

算法所花费的时间 T(n) 通常是大小的函数, n,输入数据。假设您编写了一个显示以下时间循环的程序:

T(n) = T(n/2) + a ,如果 n > 1

T(n) = b,如果 n=1

这是我尝试过的:

T(n/2) = T(n/4) + a T(n/4) = T(n/8) + a

所以:

T(n) = T(n/4) + 2*a = T(n/8) + 3*a = T(n/K) + 3*a

到这里,我想让T(n) = 1,程序应该被终止,所以我做

n/K = 1 -> K = n

我得到:

T(n/n) + 3*a = b + 3a

但答案显示该程序具有对数复杂度,解决方案应为 T(n) = a ∗ log2(n) + b

我不明白如何获得上述解决方案,有人可以帮助我吗? 谢谢!

【问题讨论】:

    标签: time-complexity recurrence


    【解决方案1】:

    这样想。在每次迭代中,您将问题大小 n 减半:从 n 到 n/2 到 n/4,依此类推。您可以想象一棵“树”,通常您有一个像 T(n) = a * T(n/b) + f(n) 这样的公式,然后在您的树中,每个节点的度数为 a,并且每个节点的问题大小被划分由 b。在您的情况下,树在每个级别都有一半的问题大小,但树节点的度数保持为一。

    n/2: a
         \
    n/4:  a
          \
    n/8:   a
           \
            ...
            \
    n/n:     b + a
    

    我假设您知道这棵树有多深,以及如何达到您描述为解决方案的给定复杂性。


    另一种看待它的方式,更接近您的具体练习:在每次迭代中添加一个a 对吗?您多久添加一次这样的a

    【讨论】:

    • 感谢您的解释!在每次迭代中,我们将添加一个“a”,并且每次 T(n) 中的 n 除以 2。
    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 2020-11-09
    相关资源
    最近更新 更多