n个数的乘积算法

时间:2013-12-15 08:42:16

标签: algorithm

我有一个关于表达n个数的乘积的算法的运行时间的问题。我认为最好的解决方案是分而治之,它基于将n元素递归地减半并且乘以2个元素。令人困惑的部分是简单操作的数量。在Divide and Conquer的情况下,复杂度应为O(logn)因此,如果我们有8个数字相乘,我们最终应该有3个基本步骤,例如我们有8个数字...我们可以将8减半,直到达到2并开始相乘它...(a1 a2 a3 a4 a5 a6 a7 a8)...(a1 * a2 = b1)(a3 * a4 = b2)(a5 * a6 = b3)(a7 * a8 = b4)(b1 * b2 = c1) )(b3 * b4 = c2)(c1 * c2 =最终结果)..但是,在这个结果中我们需要7个简单的乘法。有人可以向我澄清这个......?

3 个答案:

答案 0 :(得分:1)

划分和征服是指您可以将原始组划分为多个子集的情况,在您识别并创建它们之后,不再进行交互(或者只是以与每个子集上的操作相比可忽略不计的方式进行交互) )。在您的情况下,您违反了“子集在识别后不进行交互”规则。

另外,O(x)并不意味着操作次数小于x。它只是意味着,对于任何大小为x的具体数据集,存在有限值d,因此所需的操作数小于d * x。 (我的母语是德语,我希望在翻译时我没有改变意思)。因此,您需要对8个数据项进行8次操作这一事实本身并不意味着复杂性大于O(log n)。

答案 1 :(得分:0)

无论您选择哪种方式执行n数字的乘法运算,您都需要将所有数字相乘,并进行n-1次乘法运算。因此,此乘法的时间复杂度始终为O(n)

以下是我如何解释按您的方法将n数字相乘所需的步数接近n,而不是log(n)。要乘以n个数字,您需要先进行n/2个乘法 - 第一个数字用第二个,第三个用第四个,依此类推,直到n-1 - 和n - 数量。在那之后你有n/2个数字并将它们乘以你需要的所有n/4次乘法 - 先前乘以第二个的结果,第三个是第四个,依此类推。之后,您有n/4个号码,您将进行n/8次乘法运算。当你只剩下两个数字时,这个过程将结束 - 它们的乘法会给你结果。
现在,让我们计算所需的乘法总数。在第一阶段,你已经进行了n/2次乘法,在第二阶段 - n/4,依此类推,直到只有一次乘法。您有以下顺序:n/2 + n/4 + n/8 + ... + 1。结果表明,这种序列的总和等于n。

答案 2 :(得分:0)

如果我正确理解你的目标,那么复杂性应该是O(n),因为你可以按顺序乘以n个值。对于n值,您需要n-1次乘法。不需要任何分而治之。