这应该很简单,但我在查找printRow()
函数的时间复杂度方面遇到了麻烦。
我的猜测是,由于printChar()
是O(n),printRow()
必须是O(a + b)。
我不确定这是正确还是不正确。任何有关解释的帮助都会很棒!
// prints a row consisting of " " a times and "*" b times...
// a and can be <, =, or > b
// complexity: O(?)
function printRow(a, b) {
var str = '';
// prints " " a times
str += printChar(" ", a);
// prints "*" b times
str += printChar("*", b);
return str;
}
// prints char n times
// complexity: O(n) because of the for loop
function printChar(char, n) {
var str = '';
for (var i=0; i<n; i++) {
str += char;
}
return str;
}
答案 0 :(得分:1)
其中很大一部分是+ =。
的实施在最糟糕的情况下,要制作更长的字符串,必须为结果字符串进行足够大的内存分配。接下来是将字符串的整个内容复制到新位置。
像这样复制整个字符串是O(n)操作。在追加每个字符时执行此操作,一次一个将使整个算法成为O(n ^ 2)。
最佳案例:您预先分配所需的总空间,然后将其填入您需要的数据。这是O(n)。
在两者之间有一个共同的O(n)策略,其中分配给字符串的空间可能比它需要的大,并且随着你的增长,它会填满它。当需要更多的空间分配与当前大小成比例(比如说大小加倍),当前字符串被复制到那里,然后该过程可以继续。
每次扩展都像以前一样昂贵,但它们的频率也明显降低,并确实给出了摊销的O(n)运行时间。