如何在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.是的,余数运算符优先于减法运算,因此它是后者。我添加了一个解释,说明如何推导基于对数的公式。是的,循环执行非浮点计算,得到与对数公式相同的结果。