想知道这个Java代码片段的时间复杂性吗
我想知道以下代码片段的时间复杂性想知道这个Java代码片段的时间复杂性吗,java,time-complexity,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();
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();
FileReader fr=newfilereader(“myfile.txt”);
BufferedReader br=新的BufferedReader(fr);
对于(长i=0;i
编辑:我想说,n=一个常量,例如100000,我不确定你所说的“时间复杂度”是什么意思,但它的性能似乎与它读取的文件大小成线性关系(也称为O(n))。我不确定你所说的“时间复杂度”是什么意思,但它的性能似乎是线性的(也称为O(n))根据读取文件的大小。读取整个文件的时间复杂度应为
O(N)
,其中N
是文件的大小
然而,考虑到涉及的软件数量,证明这一点是困难的。您已经在main
方法中获得了Java代码、读卡器堆栈(包括字符集解码器)和JVM。那么你就在操作系统中有了代码。然后,您必须考虑内核内存中的文件缓冲、文件系统组织、磁盘查找时间等等
(仅仅考虑应用程序所花费的时间是没有意义的。我们可以安全地预测总时间的组成部分将被其他组件所支配)。
而且,正如Aaron所说,复杂性度量不能可靠地预测实际的文件读取时间。读取整个文件的时间复杂性应该是
O(N)
,其中N
是文件的大小
然而,考虑到涉及的软件数量,证明这一点是困难的。您已经在main
方法中获得了Java代码、读卡器堆栈(包括字符集解码器)和JVM。那么你就在操作系统中有了代码。然后,您必须考虑内核内存中的文件缓冲、文件系统组织、磁盘查找时间等等
(仅仅考虑应用程序所花费的时间是没有意义的。我们可以安全地预测总时间的组成部分将被其他组件所支配)。 而且,正如Aaron所说,复杂性度量不会成为实际文件读取时间的可靠预测指标。
复杂性是O(n),但这并不能告诉你多少,因为你不知道每个readLine()
需要多少时间
当单个操作的运行时行为非常多变时,计算复杂性没有多大意义
在这种情况下,循环非常便宜,对整个程序的运行时间没有多大贡献。另一方面,从磁盘加载对运行时的贡献很大,但如果没有关于每个文件的平均行数和平均行长的统计信息,很难说。复杂性是O(n),但这并不能告诉您多少,因为您不知道每个readLine()
需要多少时间
当单个操作的运行时行为非常多变时,计算复杂性没有多大意义
在这种情况下,循环非常便宜,对整个程序的运行时间没有多大贡献。另一方面,从磁盘加载对运行时的影响很大,但是如果没有关于每个文件的平均行数和平均行长的统计信息,很难说。readLine()函数必须扫描输入的每个字符,直到下一个换行。这应该是O(N),其中N是前N行(您读取的)中的字节数。使用缓冲读取器并不会降低算法复杂性,它只是减少了读取给定字节数所需的实际IO调用数(这是一件好事,因为IO调用非常昂贵)。在这种情况下,改变情况的唯一方法是如果缓冲区的读取大小远远大于要读取的字节总数。readLine()函数必须扫描输入的每个字符,直到下一个换行符。这应该是O(N),其中N是前N行(您读取的)中的字节数。使用缓冲读取器并不会降低算法复杂性,它只是减少了读取给定字节数所需的实际IO调用数(这是一件好事,因为IO调用非常昂贵)。在这种情况下,改变情况的唯一方法是如果缓冲区的读取大小远远大于要读取的总字节数。这是一个非常简单的情况,但下面介绍如何找到时间复杂度。同样的方法也适用于更复杂的算法 对于代码的以下部分(并且不考虑
readline()
的复杂性)
for(长i=0;i
i=0
将执行(n-1)次,i
将执行n次,i++
将执行n-1次,br.readline()代码>将执行n-1次
这给了我们n-1+n+n-1+n-1=4*n-3。这与n
成正比,因此复杂性是O(n)这是一个非常简单的情况,但下面是如何找到时间复杂性。同样的方法也适用于更复杂的算法
对于代码的以下部分(并且不考虑readline()
的复杂性)
for(长i=0;i
i=0
将执行(n-1)次,i
将执行n次,i++
将执行n-1次,br.readline()代码>将执行n-1次
这给了我们n-1+n+n-1+n-1=4*
for (long i = 0; i < n-1; i++ ) {
br.readLine();
}