toString时间和空间的复杂性

时间:2015-06-23 21:51:42

标签: java time-complexity tostring space-complexity

考虑以下方法:

public String toString()
{
    if (_head == null)
        return "";
    String S="";
    WordNode currentNode = _head;
    while (currentNode != null)
    {
       S+=currentNode.getWord()+" ";
       currentNode = currentNode.getNext();
    }   
    return S;

}

什么是时间和空间的复杂性? 在Java中,String是不可变对象。它如何影响复杂性? 感谢。

3 个答案:

答案 0 :(得分:4)

时间复杂度为O(n),其中n是节点数,因为您遍历每个节点一次。空间复杂度实际上是O(n * m),其中n是节点数,m是您将创建的最大字符串的长度(这是包含所有单词的最后一个字符串)。这是因为你创建了n个字符串,而java中的字符串创建的内存使用量与字符串中的字符数成比例(在你的情况下是最大的m)。如果您想确切了解内存字符串创建的使用量,请参阅以下链接:http://www.javamex.com/tutorials/memory/string_memory_usage.shtml

顺便说一下,你真的不需要在函数的开头检查if,因为如果head为null,你的while循环将不会进行任何迭代,你仍然会返回一个空字符串。取出这个条件将通过一个恒定因子改善你的时间表现(但时间复杂度当然是相同的)。

答案 1 :(得分:1)

时间复杂度为O(L*N),其中N是节点数,L是结果字符串的长度:

如果除第一个节点外的所有节点都包含长度为1的字符串,并且第一个节点包含字符串L-2*(N-1)-1。然后,存储在S中的字符串在循环的迭代中具有长度

L-2*(N-1)
L-2*(N-2)
L-2*(N-3)
...
L

这些值的总和在O(L*N)中。由于分配字符串需要与sting大小成比例的时间,因此算法具有时间复杂度O(N*L)

空间复杂度为O(L),因为存储在S中的stings长度为O(L),并且只要S,垃圾收集器就可以回收先前迭代的中间结果。被覆盖。

您可以使用StringBuilder将其提升为空间和时间复杂度O(L)

public String toString()
{
    if (_head == null)
        return "";
    StringBuilder S=new StringBuilder();
    WordNode currentNode = _head;
    while (currentNode != null)
    {
       S.append(currentNode.getWord()).append(" ");
       currentNode = currentNode.getNext();
    }   
    return S.toString();

}

答案 2 :(得分:0)

遍历n个项目的每个循环具有时间复杂度O(n)。当你在另一个循环中嵌套循环时

while(...) {
   while(...) {
    ...
   }
}

它变成了O(n ^ 2)等等。

由于您只使用一个循环,因此方法时间复杂度为O(n)。

相关问题