【问题标题】:String time complexity字符串时间复杂度
【发布时间】:2016-08-29 10:56:45
【问题描述】:
public String joinWords(String[] words)
{ 
     String sentence = "";
     for (String w : words)
     {
        sentence = sentence + w;  
     }
     return sentence;
}

假设所有字符串的长度都相同(称为 x)并且有 n 个字符串。 在每次连接时,都会创建一个新的字符串副本,然后逐个字符地复制这两个字符串。第一次迭代需要我们复制 x 个字符。第二次迭代需要复制 2x 个字符。第三次迭代需要 3x,依此类推。因此总时间为 O(x + 2x + . . . + nx)。这减少到 O(xn^2)。

1)我无法从书中回答他们如何在第三次迭代中获得 3x 个字符,在第 4 次迭代中获得 4x 个字符。 String 是不可变的,并且在每个句子变量赋值中都会创建新的 String 对象。 然后应该将字符串 char 的先前值复制 char 和 w 的值。我又得到了 2x 个字符。 谢谢你们 !

【问题讨论】:

  • 您忘记了 C++、JavaScript 和 Scala 标记...
  • @Tom,不错的评论伙伴......真的很喜欢它

标签: java c# python string data-structures


【解决方案1】:

在第一次迭代中,sentence 有 0 个字符,w 有 x 个字符,所以你必须复制 x 个字符。

在第二次迭代中,sentence 有 x 个字符,w 有 x 个字符,所以你必须复制 2*x 个字符。

在第三次迭代中,sentence 有 2*x 个字符,w 有 x 个字符,所以你必须复制 3*x 个字符。

在第 4 次迭代中,sentence 有 3*x 个字符,w 有 x 个字符,所以你必须复制 4*x 个字符。

等等……

【讨论】:

    【解决方案2】:

    String 本身是不可变的,但引用不是。

    假设下一个例子:

    String s = "1";
    s = s + "2";
    

    s 将包含值"12",但字符串"1" 不会改变。 我们可以在下一个例子中检查它:

    String s = "1";
    String sBak = s;
    s = s + "2";
    

    s 再次等于"12"。我们可以检查sBak 以确保"1" 没有改变。

    现在回到您的示例。假设words = {"first, "second", "third"}

    语句sentence = sentence + w; 更新sentence 变量。第一次迭代后,它将是"" + "first",即"first"。在第二次迭代之后,它将等于"first" + "second" 等等。

    所以sentence引用的字符串长度每次都会增加(每次sentence会指向不同的字符串)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2020-09-25
      • 2015-10-14
      相关资源
      最近更新 更多