Javascript 如果您进行更多的处理,为什么下列算法中的一个比另一个更快? 功能反向限制(str){ 让newStr='' for(设i=(str.length-1);i>=0;i--){ newStr+=str[i] } 返回新闻 } //这个算法更快 功能反向限制2(str){ str=str.split(“”) 设左=0 let right=str.length-1 while(左

Javascript 如果您进行更多的处理,为什么下列算法中的一个比另一个更快? 功能反向限制(str){ 让newStr='' for(设i=(str.length-1);i>=0;i--){ newStr+=str[i] } 返回新闻 } //这个算法更快 功能反向限制2(str){ str=str.split(“”) 设左=0 let right=str.length-1 while(左,javascript,string,algorithm,time,big-o,Javascript,String,Algorithm,Time,Big O,如果函数执行更多的处理,将字符串转换为数组,然后连接整个数组,为什么reverseString 2比reverseString更快?其优点是,主要算法是O(n/2),而其余算法是O(n)。为什么会这样 结果如下: str大小:20000000 反向限制:4022.294ms 反向限制2:1329.758ms 提前感谢。在第一个函数reverseString()中,循环运行了“n”次。这里的“n”表示字符串的长度。您可以看到,您正在执行n次循环以获得反向字符串。所以这个函数所花费的总时间取决于'n

如果函数执行更多的处理,将字符串转换为数组,然后连接整个数组,为什么
reverseString 2
reverseString
更快?其优点是,主要算法是O(n/2),而其余算法是O(n)。为什么会这样

结果如下:
str大小:20000000
反向限制:4022.294ms
反向限制2:1329.758ms


提前感谢。

在第一个函数
reverseString()
中,循环运行了“n”次。这里的“n”表示字符串的长度。您可以看到,您正在执行n次循环以获得反向字符串。所以这个函数所花费的总时间取决于'n'的值

在第二个函数中,while循环只运行了n/2次。查看
left
right
变量可以理解这一点。对于循环的一次执行,
left
变量增加1,
right
变量减少1。因此,您正在同时进行2次更新。因此,对于一个n长度的字符串,它只执行n/2次


虽然第二个函数中的语句要多得多,但它们的执行时间要比第一个函数中的语句少得多。因此,函数
reverseString2()
更快。

reverseString
中,每个追加操作都需要额外的字符串内存,而在第二种方法中,我们只是切换存储在每对索引中的值。连接列表也足够快,因为它是一个线性数据结构
O(N/2)==O(N)
我试图用他使用的术语回答你当时使用的术语不正确。拥有
n
操作和拥有
order(n)
不是一回事!谢谢你指出它们。我的错。我编辑了它
function reverseString(str) {
  let newStr = ''
  for (let i = (str.length - 1); i >= 0; i--) {
    newStr += str[i]
  }

  return newStr
}

// This algorithm is faster
function reverseString2(str) {
  str = str.split('')
  let left = 0
  let right = str.length - 1
  while (left < right) {
    const tmp = str[left]
    str[left] = str[right]
    str[right] = tmp
    left++
    right--
  }
  return str.join('')
}