system.out.println的时间复杂度

时间:2013-09-08 05:05:15

标签: java time-complexity println system.out

在我的算法课程中,我被告知不同的事情,并且想知道我是否可以得到关于Java的System.out.println()命令的时间复杂性的明确答案。

例如,对于N?

,下面的时间复杂度是多少?
String stringy = "";
while(stringy.length() < N) {
    System.out.println(stringy);
    stringy += "X";
}

感谢您帮助新人!

6 个答案:

答案 0 :(得分:2)

此代码的时间复杂度为O(N * N),因为它是打印N次的循环。我不知道你被告知了什么,但打印的时间复杂度并不比Java中的O(N)差。

在您的代码中,您为每行添加“X”,因此您的打印将是:

X
XX
XXX
XXXX
XXXXX
XXXXXX
.
.
.

所以它的复杂性计算为Arithmetic progression,我们得到:

(1+N)*N/2=O(N^2)

了解该命令的工作原理,您可以阅读herehere

  

一般认为SOP的性能不佳。什么时候我们   深入分析,调用顺序就像println - &gt;打印 - &gt;   write()+ newLine()。这个序列流是一个实现   Sun / Oracle JDK。 write()和newLine()都包含synchronized   块。同步有一点开销,但不止于此   向缓冲区添加字符和打印的成本很高。

     

当我们运行性能分析时,运行多个SOP和   记录时间,执行持续时间按比例增加。   当我们打印超过50个字符并打印时,性能会下降   超过50,000行。

     

这完全取决于我们使用它的场景。无论如何,做   不要使用System.out.println来记录到stdout。

答案 1 :(得分:2)

时间复杂度告诉你算法每增加一个输入大小需要做多少工作,给出或取一些常数系数。

因此,O(2 N)的上限复杂度等于复杂度O(23587 N),因为此处的实际定义

http://en.wikipedia.org/wiki/Big_O_notation

指出系数可以是任何数字,无论多大,只要它在输入大小方面是固定的。

因为你没有在循环中使用'N',你只是在String上添加一个char,每次迭代的工作量等于你有多少次迭代 - &gt; O(N)

如果你有“stringy + = stringy;”相反,它将是O(N ^ 2)因为每次迭代你需要做的工作量增加一倍

* *注意

我假设system.out.print是一个原子语句,即它将所有字符打印为单个动作..如果它分别打印每个字符,那么它的O(N ^ 2)....

答案 2 :(得分:2)

我已经运行了一个基本的 Python 程序来检查 print 语句在 Python 中的时间复杂度,以获取可变数量的字符打印。代码如下 -

import time

def current_milli_time():
    return round(time.time() * 1000)

=====================================

startTime1 = current_milli_time()

for i in range(10000):
    print("a", end="")

endTime1 = current_milli_time()

=====================================

startTime2 = current_milli_time()

for i in range(10000):
    print("ab", end="")

endTime2 = current_milli_time()

=====================================

startTime3 = current_milli_time()

for i in range(10000):
    print("abc", end="")

endTime3 = current_milli_time()

=====================================

print("\nTime(ms) for first case: ", endTime1 - startTime1)
print("Time(ms) for second case: ", endTime2 - startTime2)
print("Time(ms) for second case: ", endTime3 - startTime3)

Output of the code

我们可以看到,在第一种情况下我们只打印了“a”,在第二种情况下我们打印了“ab”,在第三种情况下我们打印了“abc”,时间复杂度随字符数线性增加。< /p>

因此,可以说对于每种语言,print 语句都需要 O(lengthOfString) 时间。

答案 3 :(得分:1)

这里有一个很好的答案: http://www.quora.com/What-exactly-is-the-time-complexity-for-System-out-println-in-Java-O-1-or-O-N

主要思想是打印一个字符串实际上是将它复制到stdout - 我们知道字符串的副本是o(n)。

第二部分说您可以尝试多次打印: - 一个角色 - 一个非常大的字符串 你会看到时差!! (如果打印将是o(1)你不会)

答案 4 :(得分:0)

System.out.println(stringy);命令的时间复杂度???

你基本上是指上面代码片段的时间复杂度。看来,时间复杂度与一个特定的代码或语言并不特别相关,它基本上意味着理论上理论上的时间长度是多少。码。这通常取决于两件或三件事:

  • 输入的大小
  • 多项式次数(在求解多项式方程的情况下)

现在在你的代码的这一部分:

String stringy = "";
while(stringy.length() < N) {// the loop will execute in order of N times 
    System.out.println(stringy);//println will execute in order of N times too as in printing each character 
    stringy += "X";
}

显然取决于输入的大小,当然是字符串的长度。 首先while循环执行少于N(因为条件stringy.length() < N使<=使它运行字符串的整个长度)我们可以按N的顺序说出并打印字符串将按N的顺序完成,因此整个代码的运行时间为O(N^2)

答案 5 :(得分:0)

此代码的复杂性为O(n^2)。它迭代循环N次,并且因为System.out.println必须打印每个字符,每次迭代打印0到N个字符,平均N / 2,你删除常量,N * N = N ^ 2。以同样的方式,添加到字符串将导致整个字符串被复制(字符串在Java中是不可变的,因此任何更改意味着您必须将整个字符串复制到新字符串中)。这是另一种线性操作。因此n * (n/2 + n/2)仍然是二次序 - O(n^2)

String stringy = "";
while(stringy.length() < N) { // will iterate N times
    System.out.println(stringy); // has to print N letters
    stringy += "X"; // has to copy N letters into a new string
}