【问题标题】:Like to know the time complexity of this code snippet in Java想知道这段代码在Java中的时间复杂度
【发布时间】:2012-09-12 11:35:12
【问题描述】:

想知道下面代码sn-p的时间复杂度,

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)。

标签: java time-complexity


【解决方案1】:

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

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

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

【讨论】:

  • 现在说文件大小现在是 2GB。如果我进行字符串比较,例如,复杂性是否仍然存在 O(n)? if (br.readline().equals("myname")) 在循环内?
  • 是的,因为这是一个常数时间操作(与常数比较)。实际上,运行时确实取决于readline() 的结果,但 O() 复杂度计算允许一些余地。可以这样想:在整个文件中,readline() 平均需要多少时间。因此运行时间可以计算为average-time-per-readline * N,其中每个文件的左侧部分是“常量”。复杂度中的常量变为1,因此您最终会得到O(1*N)O(N)
【解决方案2】:

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

对于以下代码部分(并且不管readline()的复杂性如何)

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

i = 0 将被执行 (n-1) 次,i &lt; n-1 将被执行 n 次,i++ 将被执行 n- 1 次,br.readline(); 将被执行 n-1 次。

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

【讨论】:

    【解决方案3】:

    我不确定您所说的“时间复杂度”是什么意思,但它的性能似乎与它读取的文件大小呈线性关系 (AKA O(n))。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        (仅仅考虑只是应用程序所花费的时间是没有意义的。我们可以有把握地预测,总时间所花费的部分将被其他组件所支配。)

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

        【讨论】:

        • 我会说n 是查找的大小,它可能比 N(文件的大小)小得多或大得多
        • 除非您假设 N 是文件大小的非线性函数,否则这不会改变计算复杂度。
        • 同意。您可能正在寻找可以改变您定义n 的标题条目。
        猜你喜欢
        • 2018-03-19
        • 2013-11-18
        • 1970-01-01
        • 2020-07-24
        • 2021-06-23
        • 2021-10-23
        • 1970-01-01
        • 2023-02-26
        • 1970-01-01
        相关资源
        最近更新 更多