javascript中字符串迭代和连接的时间和空间复杂性

javascript中字符串迭代和连接的时间和空间复杂性,javascript,string,algorithm,big-o,Javascript,String,Algorithm,Big O,在这个问题上,我不太关心正确的答案,而是解释,因为我在互联网上看到了关于这个问题的相互矛盾的答案 下面是一个示例问题: function reverseStr(str) { let output = "" for (var i = str.length-1; i >= 0; i--;) { output += str[i] } return output } 空间和时间的复杂性是什么 空间复杂性我的假设#1是空间复杂度为O(n)。随着输入字符串的增长,我们

在这个问题上,我不太关心正确的答案,而是解释,因为我在互联网上看到了关于这个问题的相互矛盾的答案

下面是一个示例问题:

function reverseStr(str) {
  let output = ""

  for (var i = str.length-1; i >= 0; i--;) {
    output += str[i]
  }

  return output


}
空间和时间的复杂性是什么

空间复杂性我的假设#1是空间复杂度为O(n)。随着输入字符串的增长,我们需要存储另一个相同大小的副本(变量输出),然后再返回它。然而,我的困惑在于字符串是不可变的,这意味着从技术上讲,每当我们在for循环中遇到一个新字符并连接时,就会生成一个新的字符串副本。当然,我们不再需要我们的旧字符串,所以它将被垃圾收集(。。。但它是否仍在内存中存储了一段时间?即使它存储在内存中,我也不认为它会影响这个问题的实际空间复杂性,但再一次,我更感兴趣的是了解这里的细节

时间复杂性我的假设#2是这里的时间复杂性为O(n)。我们在循环中查看每个字符一次(这一部分很清楚)。然后我们执行串联。然而,我的假设是,
'a'+'bcd'
的癌变与
'a'+'bcdefghijklmn'
的连接需要相同的时间。。。或者,当两个字符串的大小增加时,这种直接连接会花费更多的时间吗?如果是这种情况,那么时间复杂度将是O(n**2)


多谢各位

对于空间复杂性,它可能取决于JavaScript实现。字符串是不可变的,但这并不意味着浏览器没有适当的优化来创建字符串缓冲区/字节,而不是多个字符串对象。问题二的答案是相似的,但也取决于C(或浏览器)的复杂性。MEMCPY。由于浏览器是用C++实现的,并且语言支持可变字符串,所以我认为时间和空间复杂度都是O(n)。但我将遵循这条线索,看看是否有人有更好的答案。