变长#s的有效乘法[概念]

时间:2012-03-24 23:16:55

标签: math language-agnostic recursion complexity-theory

修改

所以我似乎“低估了”不同长度数字的含义。我甚至没想过操作数是100位数的情况。在那种情况下,我提出的算法绝对没有效率。我可能需要一个实现,其复杂性取决于每个操作数中的数字位数而不是数值,对吧?

如下所示,我将研究Karatsuba算法......


编写一个算法的伪代码,该算法包含两个任意长度的数字(以字符串形式提供),并计算这些数字的乘积。使用有效的过程来增加大量任意长度。分析算法的效率。

我决定采用(半)简单方法并使用俄罗斯农民算法。它的工作原理如下:

a * b = a/2 * 2b if a is even 
a * b = (a-1)/2 * 2b + a if a is odd

我的伪代码是:

rpa(x, y){
    if x is 1
        return y
    if x is even
        return rpa(x/2, 2y)
    if x is odd
        return rpa((x-1)/2, 2y) + y
}

我有3个问题:

  1. 这对于任意长度的数字有效吗?我用C实现了它并尝试了不同长度的数字。在所有情况下,运行时间几乎是即时的,因此很难凭经验判断......
  2. 我可以应用硕士定理来理解复杂性吗?
    • a =递归中的#subproblems = 1(所有州最多1次递归调用)
    • n / b =每个子问题的大小= n / 1 - > b = 1(问题不会改变大小......?)
    • f(n ^ d)=在递归调用之外完成的工作= 1 - > d = 0(当a为奇数时加法)
    • a = 1,b ^ d = 1,a = b ^ d - > 复杂性在n ^ d * log(n)= log(n)
    • 这在逻辑上是有道理的,因为我们在每一步都将问题减半,对吗?
  3. 通过提供任意长度的数字“作为字符串”,我的教授可能意味着什么。为什么这样?
  4. 非常感谢提前

2 个答案:

答案 0 :(得分:1)

通过提供任意长度的数字“作为字符串”,我的教授可能意味着什么。为什么这样做?

这实际上改变了有关问题的一切(并使您的算法不正确)。 这意味着1234作为1,2,3,4提供,你不能直接操作整数。您需要根据#additions,#multiplication,#divivs来分析算法。 你应该期望一个除法比一个乘法更贵,而且乘法比一个加法要贵得多。因此,一个好的算法会尝试减少分割和乘法的次数。

查看Karatsuba algorithm,(ps不要复制它不是教师想要的)是本规范中最快的之一。

答案 1 :(得分:0)

添加3):本机整数受限于它们可以表示的大(或小)数(例如,32位或64位整数)。要表示任意长度的数字,您可以选择字符串,因为那时您并不受此限制。当然,问题是你的算术单位并没有真正添加字符串; - )