【发布时间】: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