如何在JavaScript中更有效地实现这些从基数到字符串的函数?
目前,有两个函数用于将给定字符集中的整数转换为字符串,然后返回:如何在JavaScript中更有效地实现这些从基数到字符串的函数?,javascript,string,algorithm,integer,radix,Javascript,String,Algorithm,Integer,Radix,目前,有两个函数用于将给定字符集中的整数转换为字符串,然后返回: const parseInt = (value, code) => { return value.split('').reduce((r, a) => r * code.length + code.indexOf(a), 0) } const toString = (value, code) => { var digit, radix = code.length, result = ''
const parseInt = (value, code) => {
return value.split('').reduce((r, a) => r * code.length + code.indexOf(a), 0)
}
const toString = (value, code) => {
var digit,
radix = code.length,
result = '';
do {
digit = value % radix;
result = code[digit] + result;
value = Math.floor(value / radix);
} while (value)
return result;
}
toString(115, 'abcdefghijklmnop') // => 'hd'
但是,如果这是C或者是静态内存分配的话,那么从这个角度来看,它们是低效的。result=code[digit]+result
一次生成一个字符串一个字符,在每次迭代中完全重新生成字符链
如何简化此过程,以便:
toString
后,您如何更改parseInt
函数来解释如何反转toString
还有没有可能摆脱Math.floor
?如果没有,那没关系,但希望有一个潜在的方法。如果有办法摆脱Math.floor
如果遵守了字符集长度或输入大小的某些限制,请在评论中提及,我可能会就此提出另一个问题。谢谢大家!
显然,您可以(以某种方式)反转函数并在字符数组上添加.reverse()
,但理想情况下,我们可以通过减法步骤(和重新排列)进行优化,而不是添加额外的步骤。这需要高度优化
注意。解算算法输出不必与上述算法相同。输出可以反转,这是可以的。只需寻找此函数的高度优化变体,它通常可以完成相同的任务:使用字符集将整数编码为字符串,并将其反转以返回整数。使用
基数编码的严格正值所需的位数由以下公式给出,截断为最接近的整数:
⌊1+对数半径值⌋
阅读你的问题,我怀疑你想避免浮点运算,所以上面的公式。因此,您需要进行“试运行”,以查看存储结果所需的大小,即通过迭代和整数运算计算上述表达式
下面是它的样子:
constparseint=(值,代码)=>{
设结果=0,
基数=代码长度;
为了(让一个有价值的人){
结果=结果*基数+代码索引(a);
}
返回结果;
}
constbaselog=(base,x)=>Math.log2(x)/Math.log2(base);
常量toString=(值,代码)=>{
让数字,
基数=代码长度,
结果,,
len=1,
温度=值;
//计算len=Math.max(1,1+Math.floor(baseLog(基数,值)))
while(温度>=基数){
len++;
温度=(温度-温度%基数)/基数;
}
//在另一种语言中,您可以在此处分配内存:
结果=数组(len);
做{
数字=数值%基数;
蓝--;
//从阵列的背面填充到开头
结果[长度]=代码[位数];
值=(值-数字)/基数;
}while(len);
返回结果。join(“”;//将字符数组转换为字符串
}
log(toString(115,'abcdefghijklmnop');//=>'hd'
log(parseInt(“hd”,“abcdefghijklmnop”);//=>115
只是出于好奇,你为什么要做这个?你可以用value=(value-digit)/radix替换地板材料,这并不是说它改变了很多事情,而是令人惊讶!你能解释一下Math.max(1,1+Math.floor(baseLog(基数,值))
在做什么吗?为什么需要计算这个看似任意的值?如果将其包装成一个函数,该函数将被调用什么?除了calculateLog
,我会称之为哈哈。。。这可能有助于澄清其目的。还有,你用while循环代替了它,while循环只是在模拟这个吗?还有,它是temp=((temp-temp)%radix)/radix
还是temp=(temp-(temp%radix))/radix
(对不起,我想我得查一下这个操作符优先级的东西,但不确定。)我想是后者,由于temp-temp
将变为零:p.是的,余数运算符优先于减法运算,因此它是后者。我添加了一个解释,说明如何推导基于对数的公式。是的,循环执行非浮点计算,得到与对数公式相同的结果。