【问题标题】:exponential multiplication algorithm that runs in O(n) time?在 O(n) 时间内运行的指数乘法算法?
【发布时间】:2014-02-03 17:50:49
【问题描述】:

我正在阅读一本算法教科书,但我被这个问题难住了:

假设我们要计算 x^y 的值,其中 x 和 y 是正数 分别具有 m 位和 n 位的整数。解决该问题的一种方法是执行 y - 1 乘以 x。你能给出一个只使用 O(n) 乘法步骤的更高效的算法吗?

这是一种分而治之的算法吗? y-1 乘以 x 会在 theta(n) 中运行,对吗? ..我不知道从哪里开始这个问题

【问题讨论】:

标签: performance algorithm runtime


【解决方案1】:

我以迭代的方式更好地理解了这一点:

您可以计算 x^z 的所有 2 次幂:z = (2^0, 2^1, 2^2, ... ,2^(n-1))

只需从 1 到 n 并应用 x^(2^(i+1)) = x^(2^i) * x^(2^i)。

现在您可以使用这些 n 值来计算 x^y:

result = 1
for i=0 to n-1:
    if the i'th bit in y is on:
        result *= x^(2^i)
return result

一切都在 O(n) 内完成

【讨论】:

    【解决方案2】:

    对分而治之应用一个简单的递归。 在这里我发布一个更像伪代码。

    x^y :=
        base case: if y==1 return x;
            if y%2==0:  
                then (x^2)^(y/2;
            else 
                x.(x^2)^((y-1)/2);
    

    【讨论】:

      【解决方案3】:

      y-1 乘法解决方案基于身份 x^y = x * x^(y-1)。通过重复应用身份,您知道您将在y-1 步骤中将y 减少到1

      更好的办法是更“有效地”减小 y。假设偶数y,我们有x^y = x^(2*y/2) = (x^2)^(y/2)。假设一个奇怪的y,我们有x^y = x^(2*y/2+1) = x * (x^2)^(y/2)

      如果您继续使用 x^2 而不是 x 进行功率计算,您会发现您可以将 y 减半。

      递归:

      Power(x, y)=
          1 if y = 0
          x if y = 1
          Power(x * x, y / 2) if y even
          x * Power(x * x, y / 2) if y odd
      

      查看它的另一种方法是将y 读取为加权位的总和。 y = b0 + 2.b1 + 4.b2 + 8.b3...

      求幂的性质暗示:

      x^y = x^b0 . x^(2.b1) . x^(4.b2) . x^(8.b2)... 
          = x^b0 . (x^2)^b1 . (x^4)^b2 . (x^8)^b3...
      

      您可以通过平方获得所需的 x 幂,y 的二元分解告诉您要乘以哪些幂。

      【讨论】:

        猜你喜欢
        • 2016-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        相关资源
        最近更新 更多