[英]Like to know the time complexity of this code snippet in Java
我想知道以下代码段的时间复杂度,
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
复杂度为O(n),但这并不能告诉您太多信息,因为您不知道每个readLine()
需要多少时间。
当单个操作具有非常可变的运行时行为时,计算复杂度没有多大意义。
在这种情况下,循环非常便宜,并且不会对整个程序的运行时间有太大贡献。 另一方面,从磁盘加载将对运行时间有很大贡献,但是如果没有有关每个文件的平均行数和平均行长的统计信息,很难说。
这是一个非常简单的情况,但是这里是找到时间复杂度的方法。 可以将相同的方法应用于更复杂的算法。
对于以下代码部分(无论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) 。
我不确定您所说的“时间复杂度”是什么,但是它的性能似乎与它从中读取文件的大小成线性关系(AKA O(n))。
读取整个文件的时间复杂度应为O(N)
,其中N
是文件的大小。
但是,鉴于所涉及的软件数量,证明这一点将很困难。 您已经在main
方法,阅读器堆栈(包括Charset解码器)和JVM中获得了Java代码。 然后,您在操作系统中有了代码。 然后,您必须考虑内核内存中的文件缓冲,文件系统组织,磁盘查找时间等。
(这是没有意义的,只是考虑只由应用程序所花费的时间,我们可以有把握地预测将采取由其他组件占据了总时间的组成部分。)
而且,正如亚伦(Aaron)所说的那样,复杂性度量并不能成为实际文件读取时间的可靠预测指标。
readLine()函数必须扫描输入的每个字符,直到下一个换行符。 这应该是O(N),其中N是前n行(您读取的)中的字节数。 使用缓冲的读取器不会降低算法的复杂性,只会减少读取给定字节数所需的实际IO调用次数(这是一件好事,因为IO调用很昂贵)。 在这种情况下,唯一改变的方法是如果缓冲区的读取大小比要读取的字节总数大得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.