Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将所有子目录中所有文件中的所有数字相加-复杂度?_Java_File_Io_Directory_Time Complexity - Fatal编程技术网

Java 将所有子目录中所有文件中的所有数字相加-复杂度?

Java 将所有子目录中所有文件中的所有数字相加-复杂度?,java,file,io,directory,time-complexity,Java,File,Io,Directory,Time Complexity,给定根目录,逐行读取根目录或子目录中的所有文件,并将每个文件中的所有数字相加。每个文件的每一行都有一个数字。所以我只需要读取所有文件,将所有数字相加,然后返回。我想出了下面的代码,它做的工作,如果有任何更好或有效的方法,让我知道 我试图了解以下程序的复杂性。如果结构很深,我们在很多子目录中有很多文件,那么下面的程序的复杂性是什么。如果在面试中被问到,我们应该如何描述这种情况的复杂性 private static int count = 0; public static void mai

给定根目录,逐行读取根目录或子目录中的所有文件,并将每个文件中的所有数字相加。每个文件的每一行都有一个数字。所以我只需要读取所有文件,将所有数字相加,然后返回。我想出了下面的代码,它做的工作,如果有任何更好或有效的方法,让我知道

我试图了解以下程序的复杂性。如果结构很深,我们在很多子目录中有很多文件,那么下面的程序的复杂性是什么。如果在面试中被问到,我们应该如何描述这种情况的复杂性

  private static int count = 0;

  public static void main(String[] args) {
    System.out.println(sumNumbersInFile("/home/david"));
  }

  private static int sumNumbersInFile(String rootDirectory) {
    if (rootDirectory == null || rootDirectory.isEmpty()) {
      return 0;
    }

    File file = new File(rootDirectory);
    for (File fileEntry : file.listFiles()) {
      if (fileEntry.isDirectory()) {
        count += sumNumbersInFile(fileEntry.getName());
      } else {
        try (BufferedReader br = new BufferedReader(new FileReader(fileEntry))) {
          String line;
          while ((line = br.readLine()) != null) {
            count += Integer.parseInt(line);
          }
        } catch (NumberFormatException | IOException e) {
          e.printStackTrace();
        }
      }
    }
    return count;
  }

每行只执行一个计算步骤。算法是在其中n是所有文件中的行数。

假设您有n个文件。因此,每个文件只访问一次。所以这一部分开始了。也就是说,m是该过程中可能出现的最大行数。每个文件中的每一行读取一次。所以,最坏的情况是,您将读取n个文件中的m行。所以,这就是*m。你可以把m看作是平均行数

之所以需要n和m,是因为有两个未知变量,文件数,不管它是否在一个文件夹中,格式化为每个目录中的一个文件和一个子目录,因为你要逐个访问,你需要访问所有文件,每个文件只访问一次,行数。它们每个都可以独立生长,因此它是两个未知函数的函数。因此,它在*m上


即使将所有行放在一个文件中,也会是Ofr,其中fr=gn*m,所以仍然是*m,其中r是行的总数r=n*m。其功能不同但顺序相同的原因,是由于通过文件夹和文件读取的启动因素,在算法开始之前应该定义一个常数,该常数不影响功能顺序。

设m为文件和子目录的数量。设n为文件中的最大行数。复杂度是omn文件的数量和子目录的数量可以不同,所以我们是否需要同时使用m?也许要问一个非常基本的问题M是文件数++子目录数。为这件事道歉ambiguity@ggbranch它不会是2^n,因为我有递归函数调用?我只是因为这个才感到困惑。那么文件的数量或者子目录的数量呢?这不重要吗?如果文件或子目录的数量超过行数,即有很多空文件或目录没有文件,只有更多的子目录,那么n将成为文件或目录的数量。但它仍然是线性复杂度。