String 简单字符串串接的时间复杂度

String 简单字符串串接的时间复杂度,string,big-o,time-complexity,String,Big O,Time Complexity,以下方法的成本是多少。你怎么计算呢 public String joinWords(String[] words) { String sentence = ""; for (String w : words) { sentence = sentence + word; } return sentence; } 假设长度为r和s的两个字符串的字符串连接成本为O(r+s)(在Java中历史上就是这种情况),则运行时为O(mn),其中n是输入字符串中的

以下方法的成本是多少。你怎么计算呢

public String joinWords(String[] words) {
    String sentence = "";
    for (String w : words) {
        sentence = sentence + word;
    }
    return sentence;
}

假设长度为r和s的两个字符串的字符串连接成本为O(r+s)(在Java中历史上就是这种情况),则运行时为O(mn),其中n是输入字符串中的字符总数,m是输入字符串的数量

要了解这一点,请注意,如果字符串长度为n1,n2,…,n_m,则运行时将为

n1+(n1+n2)+(n1+n2+n3)+…+(n1+n2+…+n_m)

=m(n_1)+(m-1)(n_2)+(m-2)(n-3)+…+努姆

=m(n_1+n_2+…+n_m)-n_2-2n_3-3n_4-…-(m-1)nm


受n_1+…+的约束n_m=n,当n_1=n且所有其他值均为0时,该值最大化。在这种情况下,运行时变为mn,因此运行时为O(mn)。

假设长度为r和s的两个字符串的串接成本为O(r+s)——在Java中历史上就是这种情况——运行时将为O(mn),其中n是输入字符串中的字符总数,m是输入字符串的数量

要了解这一点,请注意,如果字符串长度为n1,n2,…,n_m,则运行时将为

n1+(n1+n2)+(n1+n2+n3)+…+(n1+n2+…+n_m)

=m(n_1)+(m-1)(n_2)+(m-2)(n-3)+…+努姆

=m(n_1+n_2+…+n_m)-n_2-2n_3-3n_4-…-(m-1)nm


受n_1+…+的约束n_m=n,当n_1=n且所有其他值均为0时,该值最大化。在这种情况下,运行时变成mn,因此运行时是O(mn)。

最佳字符串concat将是
O(1)
。因此,您可以假设在for循环中它是
O(1)
,使整个事情
O(n)
其中
n={size of words}
它或者是摊销O(n),或者是O(n²),这取决于
字符串的实现细节。既然您还没有告诉我们这是哪种编程语言,不管您使用的是哪种字符串,我们就不能说得更具体了。@Mash连接两个字符串的最佳情况是O(n),而不是O(1),因为您必须至少读取两个字符串的每个字符,并将它们全部写入新的内存位置。@Zack:不一定;可以想象一个实现,其中目标字符串只是指向单个组件的指针列表。(然而,这显然是Java代码,所以事实并非如此!)@OliCharlesworth我见过这样的库,但它们通常不愿意称自己为字符串库(首选术语似乎是“rope”),并附带关于病态角落行为的可怕警告……最佳字符串concat应该是
O(1)
。因此,您可以假设在for循环中它是
O(1)
,使整个事情
O(n)
其中
n={size of words}
它或者是摊销O(n),或者是O(n²),这取决于
字符串的实现细节。既然您还没有告诉我们这是哪种编程语言,不管您使用的是哪种字符串,我们就不能说得更具体了。@Mash连接两个字符串的最佳情况是O(n),而不是O(1),因为您必须至少读取两个字符串的每个字符,并将它们全部写入新的内存位置。@Zack:不一定;可以想象一个实现,其中目标字符串只是指向单个组件的指针列表。(然而,这显然是Java代码,所以事实并非如此!)@OliCharlesworth我见过这样的库,但它们通常不愿意称自己为字符串库(首选术语似乎是“rope”),并附带关于病态角落案例行为的可怕警告……感谢您指出这一点!我相信这个答案早于您在这里链接的特性更改——我没有意识到Java人员正在修改这个!谢谢你指出这一点!我相信这个答案早于您在这里链接的特性更改——我没有意识到Java人员正在修改这个!