【发布时间】:2015-02-06 18:39:53
【问题描述】:
我尝试使用以下代码实现karatsuba algorithm。当 x 和 y(参数)中的位数与 recursive call 不匹配时,问题就开始了,在这种情况下,下面的逻辑不起作用。截至目前,当 x 和 y 的位数相同时,我得到了正确的输出。
更准确地说,我认为问题始于 z1 和 z3 的计算,因为这就是 x 和 y 的位数经常不匹配的地方。
对于如何定义m 的逻辑,我也有点困惑,这是这里基础的力量。我相信我正在明确我的问题?
(任何关于更多优化的建议都会更有帮助,因为我刚刚开始了我的 java 脚本之旅)。
function karatSuba(x,y)
{
var x1,x0,y1,y0,base,m;
var dummy_x = x.toString();
var dummy_y = y.toString();
var n = (dummy_x.length>dummy_y.length) ? dummy_y.length : dummy_x.length;
m = Math.round(n/2);
base = 10;
//base case
if((x<base)||(y<base))
return x * y;
//base case
var bm = Math.pow(base ,m);
var dummy_x1 = dummy_x.substring(0,n/2);
var x1 = parseInt(dummy_x1);
dummy_x1 = null;
var dummy_x1 = dummy_x.substring(n/2,n);
var x0 = parseInt(dummy_x1);
dummy_x1 = null;
var dummy_y1 = dummy_y.substring(0,n/2);
var y1 = parseInt(dummy_y1);
dummy_y1 = null;
var dummy_y0 = dummy_y.substring(n/2,n);
var y0 = parseInt(dummy_y0);
dummy_y = null;
var p = x1 + x0;
var q = y1 + y0;
var a = karatSuba(x1,y1);
var b = karatSuba(x0,y0);
var z1 = karatSuba(a,Math.pow(bm,2));
var z2 = b;
//var z3 = karatSmul(bm ,((karatSmul(p,q) - a - b)));
var z3 = bm * ((p*q) - (a) - (b));
var z = z1 + z2 + z3;
return z;
}
console.log(karatSuba(344,100));
【问题讨论】:
-
您是否尝试过简单地用前导零填充短字符串?我没有仔细检查您的所有代码,但我怀疑您在短字符串的长度小于 n/2 时遇到问题。
-
我试过了,但输出似乎令人费解。例如,在我计算 z1 时,如果它类似于 karatsuba(35,100)... 我将 z1 设为 350 而不是 3500。我相信这就是问题所在。
-
@Katie 您能否详细说明用零填充较短的字符串。像 karatsuba(35,121) 这样的案例就会失去逻辑......
标签: javascript algorithm data-structures multiplication