分而治之解决数字的力量,使用主定理进行运行时分析
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方法!以上是关于分而治之解决数字的力量,使用主定理进行运行时分析的主要内容,如果未能解决你的问题,请参考以下文章