想知道Java中这段代码片段的时间复杂度

时间:2012-09-12 11:35:12

标签: java time-complexity

我想知道以下代码段的时间复杂度,

FileReader fr = new FileReader("myfile.txt");
BufferedReader br = new BufferedReader(fr);

for (long i = 0; i < n-1; i++ ) {
   br.readLine();       
}
System.out.println("Line content:" + br.readLine());
br.close();
fr.close();

编辑:我想说,n =一个常数,例如100000

5 个答案:

答案 0 :(得分:4)

复杂性是O(n),但这并没有告诉你太多,因为你不知道每个readLine()需要多少时间。

当单个操作具有非常可变的运行时行为时,计算复杂性没有多大意义。

在这种情况下,循环非常便宜,并且对整个程序的运行时间没有太大贡献。另一方面,从磁盘加载将对运行时有很大贡献,但如果没有关于每个文件的平均行数和行的平均长度的统计信息,很难说。

答案 1 :(得分:2)

这是一个非常简单的案例,但这里是如何找到时间复杂度的。相同的方法可以应用于更复杂的算法。

对于以下代码部分(无论readline()的复杂程度如何)

for (long i = 0; i < n-1; i++ ) {
   br.readLine();       
}

i = 0将执行(n-1)次,i < n-1将执行 n 次,i++将会执行执行 n-1 次,br.readline();将执行 n-1 次。

这给出了n-1 + n + n-1 + n-1 = 4 * n-3 。这与n成比例,因此复杂度为 O(n)

答案 2 :(得分:1)

我不确定你的“时间复杂度”是什么意思,但看起来它的性能是线性的(AKA O(n))与它读取的文件的大小。

答案 3 :(得分:1)

读取整个文件的时间复杂度应为O(N),其中N是文件的大小。

然而,考虑到所涉及的软件数量,证明这将是困难的。您已经在main方法,Reader堆栈(包括Charset解码器)和JVM中获得了Java代码。然后你有操作系统中的代码。然后你必须考虑内核内存,文件系统组织,磁盘搜索时间等文件缓冲。

(仅仅考虑只是应用程序所花费的时间是没有意义的。我们可以安全地预测所花费的总时间的组成部分将由其他组件主导。)

而且,正如Aaron所说,复杂度测量不会成为实际文件读取时间的可靠预测器。

答案 4 :(得分:1)

readLine()函数必须扫描输入的每个字符,直到下一个换行符。这应该是O(N),其中N是前n行(您读取的)中的字节数。使用缓冲读取器不会降低算法复杂性,它只会减少读取给定字节数所需的实际IO调用次数(这是件好事,因为IO调用很昂贵)。在这种情况下,改变事物的唯一方法是缓冲区的读取大小是否大于您要读取的总字节数。