【问题标题】:what is the fastest way to reverse string in javascript?在javascript中反转字符串的最快方法是什么?
【发布时间】:2021-06-25 06:05:21
【问题描述】:

我认为反转字符串的最快方法是仅使用 for 循环。但是在测量执行时间之后,事实证明将其转换为数组,将其反转然后加入它会更快,据我所知这是不合理的。

我是这样测量的

const { PerformanceObserver, performance } = require("perf_hooks");

var t0 = performance.now();

var reverse = function (x) {
  x = x.toString();
  result = "";
  for (let i = x.length - 1; i >= 0; i--) { // O(n)
    result += x[i];
  }
  return;
};

reverse(1534236469);
var t1 = performance.now();
console.log("took " + (t1 - t0) + " milliseconds.");

var t3 = performance.now();

var reverse = function (x) {
  const xStrArr = Math.abs(x).toString().split(""); O(n)
  const reversStr = xStrArr.reverse().join(""); O(2n)
  return;
};

reverse(1534236469);
var t4 = performance.now();
console.log("took " + (t4 - t3) + " milliseconds.");

第二次执行,O(3n) 怎么会比 O(n) 快? 谁能给我解释一下?

【问题讨论】:

  • 循环每次迭代都会分配越来越多的字符串。您可能只是看到了 GC 清理旧的效果。
  • .reverse() 是一种本机方法,与构建您自己的 Javascript 来手动反转字符串相比,它可以被高度优化(甚至可能完全是本机代码)。
  • 如果您使用O 表示法来表达复杂性,您应该知道O(n) === O(3n),因此除了线性时间复杂度之外,两者都可以更快。
  • 另外,循环内的result += x[i]; 是构造字符串的次优方法,因为它必须不断增加所需的内存并将字符串复制到新的内存位置。

标签: javascript node.js algorithm performance time-complexity


【解决方案1】:

这可以作为另一个解决方案的例子,在这里你可以看到时间复杂度是 O(n/2),它是 O(n) 的渐近线

var reverse = function (x) {
  const length = x.length;
  for(let i = 0; i < Math.floor(length / 2); i++) {
    const temp = x[i]
    x = x.substring(0, i) + 
      x.charAt(length - i - 1) +  
      x.substring(i + 1, length - i - 1) + 
      temp + 
      x.substring(length - i)
  }
  return x
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多