繁体   English   中英

如果您进行更多处理,为什么以下算法之一比另一种更快?

[英]Why is one of the following algorithms faster than the other if you do more processing?

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('')
}

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

结果如下:
字符串大小: 20000000
反向字符串: 4022.294ms
反向字符串2: 1329.758ms

提前致谢。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM