【问题标题】:How does space complexity and time complexity work in the following scenario?空间复杂度和时间复杂度在以下场景中是如何工作的?
【发布时间】:2021-05-01 18:20:36
【问题描述】:

请原谅,因为我对空间复杂度或时间复杂度都不太熟悉。

我的问题是,

想象一下,Java 中有一段代码会读取一个 .csv 文件,然后将每一行打印到一个 .txt 文件中作为输出。

据我了解,时间复杂度在某种程度上取决于行数。 空间复杂度是运行时需要多少空间。 (如果有错误请告诉我)

如上所述, 如果我编写的代码会一次将 input.csv 中的所有行转换为某种数据结构,然后使用相同的数据结构将整个内容打印到 output.txt 中,它会不会让我的空间复杂度更差但更好的时间复杂度? 还, 如果我逐行读取并将它们打印到同一个循环内的 output.txt 上,它会给我带来更好的空间复杂度但更差的时间复杂度吗?

如果问题不清楚,请告诉我。 提前致谢。

【问题讨论】:

  • CSV 文件已经是文本文件,因此您的算法本质上只是将文本文件复制到另一个文件。执行此操作的任何合理算法的运行时间都是 O(n),并且算法的空间复杂度也是 O(n),因为您将整个文件加载到内存中。如果您改为逐块复制,则空间复杂度将为 O(1),假设这些块具有固定大小(例如,使用固定大小的缓冲区)。
  • 时间取决于输入的大小,时间complexity是在给定大小的情况下衡量所花费的时间输入,因此保持不变(唯一的依赖是算法,而不是输入,除非我们区分最佳、最差和平均情况)。在实践中,您通常更关心实际运行时间而不是复杂性,因为触发大量垃圾收集的 O(n) 算法可能比不触发大量垃圾收集的 O(n^2) 算法差很多(例如),这不是传统复杂性分析所包含的内容。

标签: algorithm time-complexity space-complexity


【解决方案1】:

空间复杂度和时间复杂度是算法的属性

就空间复杂度而言,如果您读取一行然后打印一行,那么您需要空间来存储该行作为算法的一部分。这取决于一条线的最大长度。我想输入文件可能是一行。因此,这种方法的空间复杂度为 O(n),其中“n”是输入文件的大小,或文件中最长的行。

相比之下,将所有数据读入内存大概会具有 O(n) 的空间复杂度。但是,数据结构可能很重要,这可能会成倍增加。

另一方面,一次读取 CSV 文件一个字符,然后写入该字符将使用常量空间 - 存储单个字符所需的任何空间。

至于时间复杂度,大概是读取每个字符然后写出来的工作,所以时间似乎是 O(n)。但是,如果数据以复杂的数据结构存储在内存中,这也可能会更大。

【讨论】:

    【解决方案2】:

    据我了解,时间复杂度在某种程度上取决于行数。 空间复杂度是运行时需要多少空间。

    这基本上是正确的。您的时间将与输入成线性关系,因为您将一次且仅处理一次所有输入,因为您没有进行任何魔术,例如重大转换等。也就是说,如果您处理输入的效率低下,您可能会在时间上引入大量开销,但这仍然是 O(输入大小)。

    您的空间假设是正确的:您打算一次使用多少空间?您是否要使用其中的一小部分(例如单个字符)、一部分(例如一行)、更多(例如一些字节数的缓冲区)、整个内容(所有行,O(N))还是更多空间方面的东西,因为您必须存储额外的状态?

    如果我编写的代码将 input.csv 中的所有行同时转换为某种数据结构,然后使用相同的数据结构将整个内容打印到 output.txt 中,它会给我一个空间复杂度更差但时间复杂度更高?

    这可能会让你在空间上得到 O(N),其中 N 是输入的大小;您将整个内容存储在内存中。你的时间复杂度有点复杂。从表面上看,你的时间是 O(1):你一次写完所有的东西。但由于编组数据、参与 I/O 等的开销和延迟,它可能比这更糟。没有更多细节不容易回答。

    如果我逐行读取并将它们打印到同一个循环内的 output.txt 上,它会给我带来更好的空间复杂度但更差的时间复杂度吗?

    空间,是的:你的空间将是 O(平均线大小)而不是 O(所有输入的大小)。但是考虑最好和最坏的情况。最坏的情况是 O(#lines) for space = O(size of input) 因为只有一行!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-14
      • 2016-02-13
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多