分而治之解决数字的力量,使用主定理进行运行时分析

Posted

技术标签:

【中文标题】分而治之解决数字的力量,使用主定理进行运行时分析【英文标题】:Divide and Conquer to solve the power of a number, runtime analysis with master theorem 【发布时间】:2019-11-13 04:07:08 【问题描述】:

我实现了一个分治算法来计算一个数字的幂:

public static void main(String[] args) 
    System.out.println("Result: " + pow(2, 1));
    System.out.println("Result: " + pow(2, 9));
    System.out.println("Result: " + pow(2, 8));
    System.out.println("Result: " + pow(2, 0));


private static int pow(int n, int pow) 
    if(pow == 0) 
        return 1;
    

    if(pow > 2) 
        int leftPow;
        int rightPow;

        if(pow % 2 != 0) 
            leftPow = pow/2;
            rightPow = pow/2+1;
         else 
            leftPow = pow/2;
            rightPow = leftPow;
        

        return pow(n, leftPow) * pow(n, rightPow);
     else 
        if(pow == 1) 
            return n;
         else 
            return n * n;
        
    

我的方法似乎有效,因为输出是:

Result: 2
Result: 512
Result: 256
Result: 1

现在我正在尝试使用主定理确定我的算法的运行时间:

我认为,

,由于递归调用出现了两次,

,因为我从一个问题中创建了两个子问题

和,因为合并结果需要固定时间。

分水岭常数 () 应为 。

有了这些值,我假设定理的第一条规则成立: ,与,自。

因此运行时应该是: .

我很不确定这个结果,因为我从来没有遇到过 的案例。

我的分析正确吗?

【问题讨论】:

您知道与幼稚的实现 n*n*n*n...*n 相比,您的实现不会保存任何乘法吗?如果你避免一次又一次地重新计算相同的权力,你可以,例如通过将它们存储在共享数据结构中。 @MrSmith42 是的,我知道这个实现没有性能提升。我的目标只是用分而治之的方法来实现它,因为这是给定的任务。 @MrSmith42,如果我将结果存储到内存中以便以后查找,这会是一种动态方法吗? 你可以称之为动态方法。即使在这种情况下它是一个非常简单的版本。 【参考方案1】:

首先,您应该注意到复杂性将基于pow 进行解释。因此,您分析中的n 意味着您的程序中的pow 不是n 变量。

其次,由于比较和乘法等计算的数量是恒定的(你的程序小于10),所以f(n) = \Theta(1)你可以在这里写f(n) = 1

因此,复杂度为T(n) = 2T(n/2) + 1(您也可以查看 Akra-Bazzi 方法)和T(n) = \Theta(n)

【讨论】:

是的,你说得对,我的n 应该叫pow。谢谢你的回答,我去看看Akra-Bazzi方法!

以上是关于分而治之解决数字的力量,使用主定理进行运行时分析的主要内容,如果未能解决你的问题,请参考以下文章

架构的力量!!2016解密互联网公司架构技术

计算机网络---数据通信基础

通过递归分而治之的数组中的最大数字

使用主定理的推广解决方程

检查所有元素是不是与分而治之相同

当存在三个术语时应用主定理?