在 JavaScript 中,为什么这个经典的二次追加不是 O(n²)?
s = "";
for (i = 0; i < 1000000; i++) {
s = `( ${s} )`
};
console.log(s.length)
在 Firefox 124 和 Chromium 123 中都是 O(n)。
在 Python 中,正如预期的那样,它是 O(n²):
s = ""
for i in range(50_000): # increase by 2x, gets 4x slower
s = f"( {s} )"
print(len(s))
这是什么魔力,浏览器是如何在这里作弊的? ECMAScript 规范保证这种行为吗?
这是什么魔力,浏览器是如何作弊的?
ECMAScript 规范保证这种行为吗?
不,但是每个常见的 JavaScript 引擎都实现了它,并且新的实现几乎必须这样做,因为这是构建字符串的最快方法,因此每个人都是这样做的。