这个功能的时间复杂度是多少?

时间:2015-10-01 06:08:05

标签: algorithm big-o

这应该很简单,但我在查找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;
}

1 个答案:

答案 0 :(得分:1)

其中很大一部分是+ =。

的实施

在最糟糕的情况下,要制作更长的字符串,必须为结果字符串进行足够大的内存分配。接下来是将字符串的整个内容复制到新位置。

像这样复制整个字符串是O(n)操作。在追加每个字符时执行此操作,一次一个将使整个算法成为O(n ^ 2)。

最佳案例:您预先分配所需的总空间,然后将其填入您需要的数据。这是O(n)。

在两者之间有一个共同的O(n)策略,其中分配给字符串的空间可能比它需要的大,并且随着你的增长,它会填满它。当需要更多的空间分配与当前大小成比例(比如说大小加倍),当前字符串被复制到那里,然后该过程可以继续。

每次扩展都像以前一样昂贵,但它们的频率也明显降低,并确实给出了摊销的O(n)运行时间。