Algorithm 此函数的时间复杂度是多少?

Algorithm 此函数的时间复杂度是多少?,algorithm,big-o,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) {

这应该很简单,但我很难找到我的
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;
}
//打印一行,该行由“”a次和“*”b次组成。。。
//a可以是b
//复杂性:O(?)
函数printRow(a,b){
var-str='';
//打印“”次
str+=printChar(“,a”);
//打印“*”b次
str+=printChar(“*”,b);
返回str;
}
//打印字符n次
//复杂性:O(n),因为for循环
函数printChar(char,n){
var-str='';

对于(var i=0;i而言,其中很大一部分是+=

在最坏的情况下,要使字符串变长,必须为结果字符串分配足够大的内存。接下来,将字符串的全部内容复制到新位置

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

最佳情况:预先分配所需的总空间,然后用所需的数据填充。这是O(n)

在这两者之间,有一种常见的O(n)策略,其中分配给字符串的空间可能大于它所需的空间,并且随着它的增长,它会填满这个空间。当所需的更多空间与当前大小成比例分配时(例如,将大小加倍),当前字符串会复制到其中,然后进程可以继续


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

如果字符串的+=运算符是O(1),那么您是正确的。事实上,这是一个通常不成立的大假设。Henry的正确,字符串的
+=
有两个问题:1)大多数实现偶尔需要为字符串增加内存,这可能意味着将所有现有文本复制到一个新的、更大的缓冲区的开头;但是,如果字符串的大小过小,则不会影响总体大O复杂性;2)某些语言(例如C)使用以NUL结尾的字符串,对于它们,每次追加都可能涉及到对当前端点的搜索(la
strlen
)-即O(n)(有一些有效的方法可以在C中跟踪当前端点,例如在追加时移动指针)。