在我的算法课程中,我被告知不同的事情,并且想知道我是否可以得到关于Java的System.out.println()命令的时间复杂性的明确答案。
例如,对于N?
,下面的时间复杂度是多少?String stringy = "";
while(stringy.length() < N) {
System.out.println(stringy);
stringy += "X";
}
感谢您帮助新人!
答案 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)
一般认为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)
我们可以看到,在第一种情况下我们只打印了“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
}