【问题标题】:Time complexity of an algorithm, dividing a problem of size (n) into 2 problems of size (n-1)算法的时间复杂度,将一个大小为 (n) 的问题分成 2 个大小为 (n-1) 的问题
【发布时间】:2020-10-07 18:04:07
【问题描述】:

算法 B 将问题划分为 2 个大小为 n-1 的子问题,递归求解,然后在恒定时间内组合它们。

算法B的时间复杂度是多少?

【问题讨论】:

    标签: algorithm time-complexity divide-and-conquer


    【解决方案1】:

    尝试将调用映射为树的节点:
    它是一棵树(二叉树),其中两个分支的高度均为n-1(因为递归调用的大小为n-1),因此根节点将有一个高度为n-1 的左分支和一个右分支高度为n-1 的分支。

    现在你有 2 个完整的树,每个“路径”都长 n-1,所以你有 2 个高度为 n-1 的树,它们将有 2^(n-1) 节点,所以调用的总数是:

    2^(n-1)      +      2^(n-1)       +       1  
    left branch         right branch          root node
    
    = 2 * 2^(n-1) + 1
    = 2^n (the +1 is negligible)
    

    【讨论】:

    • 那么,我在计算节点数?这是为什么?而且上面的答案和你的有点不一样?
    • @drstress 节点是递归调用,你从一个调用开始(它是根节点),它产生 2 个调用,输入大小为 n-1,所以你将有 2 个分支输入大小 = n-1,这将产生其他 2 个分支,每个分支都有 n-2,依此类推
    • 那么,主定理背后的逻辑是一样的吗?
    • @drstress 逻辑取决于,这是它的一种可能表示,但您可以通过其他方式看到它,这取决于您如何看待事物... (a+b)^2 可以被视为 (a+b)(a+b),这向许多人解释了“+2ab”,但其他人将其视为边 (a+b) 的正方形,如果你看一下它的面积正方形,您将看到 2 个正方形(面积为 a^2 和 b^2)和 2 个面积为 a*b 的矩形,因此他们会看到 +2ab 的来源......正如我所说,这只是一个表示, Daniel 的回答也是如此
    • 我无法将其与实际计算机的工作方式联系起来……当我们说时间复杂度时,我们是在谈论速度吗?
    【解决方案2】:

    在我看来基本上是这样的:

                     n                     layer 0        
                  /    \                 
               /          \             
            (n-1)          (n-1)           layer 1
           /   \        /   \          
        (n-2)   (n-2)  (n-2)   (n-2)       layer 2
         / \     / \    / \     / \
       ..............................        ...
       | | | | .............. | | | |
       1 1 1 1                1 1 1 1      layer n - 1
    

    高度(水平层数)为n,每一层i进行2^i操作,所以复杂度为:

    2^0 + 2^1 + ... + 2^(n - 1) = 
    ∑ 2^i [i = 0, ..., n - 1] =
    2^n - 1
    

    所以O(2^n - 1) = O(2^n)

    【讨论】:

    • 为什么每一层都做2^i个操作?而且下面的答案和你的有点不一样,是一样的吗?
    • 因为,正如您所说,该算法接收大小为 n 的输入,并将其递归地分成两个大小为 n - 1 的输入。第一层接收大小为n 的输入,并将其分成两个大小为n - 1 的输入。然后,第二层将处理这 2 个大小为 n - 1 的输入,并将它们分成 2 个大小为 n - 2 的输入(总共 4 个大小为 n - 2 的输入),依此类推。
    • 所以很容易看出,第一层做2^0 = 1次操作,第二层做2^1 = 2次操作,第三层,2^2 = 4次操作,第四层,2 ^3 = 8 次操作,以此类推。最后 (n-th) 层将执行 2^(n - 1) 次操作。
    • 好的,我明白了...所以除法运算的总量给出了大 O 表示法的时间复杂度?问题是在恒定时间内将它们组合起来,这是什么意思?例如,如果它说在线性时间或时间 n^3 中组合它们会有什么变化?
    • 是的,如果你需要除法直到它的值是 1,那么你需要 O(2^n) 时间来做到这一点。在恒定时间内组合意味着当您的递归返回时您不会做任何额外的繁重操作。如果它不是恒定的(比如说它是线性的),那么复杂度可能是 O(n * 2^n) 或类似的东西。
    猜你喜欢
    • 2020-03-09
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2022-10-24
    • 1970-01-01
    相关资源
    最近更新 更多